2013-03-23 41 views
3

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

让我们hello.o文件来源:

int Hello() { return 3; } 

我怎么能访问Hello仅仅具有hello.o文件ohter C程序?

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

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

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

int HelloFromElfO(const char* helloFile); 

这将执行在helloFile实施Hello功能。

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

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

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

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

+2

你没有选择简单地把它们变成共享对象,并依靠动态加载器? – NPE 2013-03-23 12:01:20

+0

@npe这是学术问题。我需要这样做。 – Ari 2013-03-23 12:33:04

+1

尝试查看'readelf'命令及其源代码,它应该显示如何从.o文件中提取所需的信息。也许你也可以看一下'dlsym'源代码,因为它可以做你想做的事情,但是在C库中。 – teppic 2013-03-23 13:00:33

回答

5

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

您可以将目标文件链接到您的可执行文件,然后您将能够访问Hello()。假设你编译你的程序的目标文件作为yourCode.o,你hello.o

cc yourCode.o hello.o -o yourExecutable 

链接此yourCode.ohere

编辑

如果您不想链接的文件,但动态加载它,然后

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

我知道。问题是我不想链接文件,我想动态加载它(并且我不想使用.so)。 这是学术问题。我需要自己实施一些“动态链接”。 – Ari 2013-03-23 12:32:24

+0

请明确指出你不想链接你的问题,否则我们不知道;) – m0skit0 2013-03-23 12:33:31

+0

我已经更新了我的答案。 – m0skit0 2013-03-23 12:46:52