c – 使用ELF文件

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

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

int Hello() { return 3; }

如何在只有hello.o文件的ohter C程序中访问Hello?

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

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

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

int HelloFromElfO(const char* helloFile);

这将执行helloFile中实现的Hello函数.

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

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

UPDATE2:
好吧,像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
>调用该功能.
> ???
>利润

上一篇:加载的ELF中的挂钩和替换导出功能(.so共享库)


下一篇:android 金钱计算BigDecimal+Scale+加减乘除