3

我需要在我的 C 程序中使用简单的 ELF 文件。我不能使用任何外部库,但我可以使用elf.h.

让我们以 hello.o 文件为源:

int Hello() { return 3; }

我如何才能Hello在只有hello.o文件的其他 C 程序中访问?

我可能应该使用这样的方法将它加载到内存中mmap。最后我需要处理很多复杂的 ELF 文件,但我现在不知道如何开始。

更新:我需要按照我描述的方式执行此操作,因为它是出于学习目的。整个问题比我描述的更复杂。

对于这个问题,假设我需要编写方法:

int HelloFromElfO(const char* helloFile);

这将执行Hello中实现的功能helloFile

我不想要完整的答案。我不需要任何代码。我需要一些东西来开始。

我对 ELF 文件结构有基本的了解,但我不知道如何在没有任何解析器或类似这样的东西的情况下使用二进制文件在 C 中工作。

UPDATE2:好的,像 readelf 这样的应用程序非常复杂。所以也许我尝试这种方式:让我们再说一遍我已经hello.o映射到内存ptr。如何获得指向Hello函数的指针?

如何从中获取任何结构化数据hello.o?我的意思是,不是纯字节,而是我可以使用的东西。

4

1 回答 1

5

这比你想象的要容易得多。ELF 与您的问题无关(mmap()甚至更远......)。hello.o不是 ELF 文件,而是目标文件。

您只需将目标文件链接到您的可执行文件,然后您就可以访问Hello(). 假设您已将程序编译为目标文件 as yourCode.o,则将其yourCode.ohello.o

cc yourCode.o hello.o -o yourExecutable

这里

编辑

如果您不想链接文件但动态加载它,那么

  1. mmap()目标文件
  2. 获取Hello()内存中的地址。您可以对此进行静态分析hello.o(例如使用objdump)并获取Hello()文件中的入口点偏移量。
  3. 将此偏移量添加到由返回的地址mmap()以获取Hello()地址。
  4. 将地址映射Hello()函数指针
  5. 调用函数。
  6. ???
  7. 利润
于 2013-03-23T12:15:41.917 回答