我需要在我的 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
获取任何结构化数据?我的意思是,不是纯字节,而是我可以使用的东西。
最佳答案
这比您想象的要容易得多。 ELF 与您的问题无关(mmap()
甚至更远...)。 hello.o
不是 ELF 文件,它是一个对象 文件。
您只需将目标文件链接到您的可执行文件,然后您就可以访问Hello()
。假设您已将程序编译为 yourCode.o
目标文件,您将此 yourCode.o
与 hello.o
cc yourCode.o hello.o -o yourExecutable
参见 here .
编辑:
如果不想链接文件而是动态加载,那么
-
mmap()
目标文件 - 获取内存中的
Hello()
地址。您可以为此静态分析hello.o
(例如使用objdump
)并获取文件中的Hello()
入口点偏移量。 - 将此偏移量添加到
mmap()
返回的地址以获得Hello()
地址。 - 将
Hello()
地址映射到 function pointer - 调用函数。
- ???
- 利润
关于c - 使用 ELF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586492/