【发布时间】:2013-03-23 11:58:03
【问题描述】:
我需要在我的 C 程序中处理简单的 ELF 文件。
我不能使用任何外部库,但我可以使用elf.h。
让我们以 hello.o 文件为源:
int Hello() { return 3; }
如何在只有hello.o 文件的其他C 程序中访问Hello?
我可能应该使用mmap 或类似的东西将它加载到内存中。最后我需要处理很多复杂的 ELF 文件,但我现在不知道如何开始。
更新: 我需要按照我描述的方式执行此操作,因为它是出于学习目的。 整个问题比我描述的要复杂。
对于这个问题假设我需要写方法:
int HelloFromElfO(const char* helloFile);
这将执行在helloFile 中实现的Hello 函数。
我不想要完整的答案。我不需要任何代码。我需要一些东西来开始。
我对 ELF 文件结构有基本的了解,但我不知道如何在没有任何解析器或类似的东西的情况下使用 C 语言处理二进制文件。
更新2:
好的,像 readelf 这样的应用非常复杂。所以也许我可以尝试这种方式:让我们再说一遍我有hello.o 映射到内存ptr。如何获得指向Hello 函数的指针?
如何从hello.o 获取任何结构化数据?我的意思是,不是纯字节,而是我可以使用的东西。
【问题讨论】:
-
你没有选择简单地将它们变成共享对象,并依赖动态加载器?
-
@npe 这是学术问题。我需要这样做。
-
尝试查看
readelf命令及其源代码,它应该显示如何从.o 文件中提取您需要的信息。也许还可以查看dlsym源代码,因为它可以满足您的需求,但在 C 库中。 -
@teppic 谢谢!我考虑过其他更复杂的应用程序,例如链接器,但我没有考虑过轻量级的应用程序,例如 readelf 或 objdump。