使用ELF文件

时间:2013-03-23 11:58:03

标签: c linux elf

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

让我们把hello.o文件作为源代码:

int Hello() { return 3; }

如何在只有Hello档案的ohter C程序中访问hello.o

我应该使用mmap或者像这样把它加载到内存中。最后我需要使用更复杂的ELF文件,但我现在不知道,如何开始。

更新: 我需要按照我描述的方式这样做,因为它是出于学习目的。 整个问题比我描述的更复杂。

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

int HelloFromElfO(const char* helloFile);

将执行Hello中实现的helloFile函数。

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

我有关于ELF文件结构的基本知识,但我不知道如何在没有任何解析器的情况下使用二进制文件在C中工作,或者像这样。

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

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

1 个答案:

答案 0 :(得分:5)

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

您只需将目标文件链接到可执行文件,即可访问Hello()。假设您已将程序编译为yourCode.o对象文件,请将此yourCode.ohello.o

相关联
cc yourCode.o hello.o -o yourExecutable

请参阅here

修改

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

  1. mmap()目标文件
  2. 在内存中获取Hello()地址。您可以为此静态分析hello.o(例如,使用objdump)并在文件中获取Hello()入口点偏移量。
  3. 将此偏移量添加到mmap()返回的地址以获取Hello()地址。
  4. Hello()地址映射到function pointer
  5. 调用该函数。
  6. ???
  7. 利润