C 使用ELF文件

C 使用ELF文件,c,linux,elf,C,Linux,Elf,我需要在我的C程序中使用简单的ELF文件。 我不能使用任何外部库,但我可以使用elf.h 让我们以hello.o文件作为源: int Hello() { return 3; } 只有Hello.o文件的ohter C程序如何访问Hello 我可能应该使用mmap或类似的方法将其加载到内存中。最后我需要处理非常复杂的ELF文件,但我现在不知道如何开始 更新: 我需要按照我描述的方式来做,因为这是为了学习。 整个问题比我描述的更复杂 对于这个问题,假设我需要编写方法: int HelloFromE

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

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

int Hello() { return 3; }
只有
Hello.o
文件的ohter C程序如何访问
Hello

我可能应该使用
mmap
或类似的方法将其加载到内存中。最后我需要处理非常复杂的ELF文件,但我现在不知道如何开始

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

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

int HelloFromElfO(const char* helloFile);
它将执行
Hello
函数,该函数在
helloFile
中实现

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

我有关于ELF文件结构的基本知识,但我不知道如何在C中使用二进制文件而不使用任何解析器或类似的东西

更新2: 好的,像readelf这样的应用程序非常复杂。因此,也许我可以这样尝试:让我们再说一遍,我在
ptr
处将
hello.o
映射到内存。如何获取指向
Hello
函数的指针


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

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

您只需将对象文件链接到可执行文件,就可以访问
Hello()
。假设您已将程序编译为对象文件,名为
yourCode.o
,则将此
yourCode.o
链接到
hello.o

cc yourCode.o hello.o -o yourExecutable

编辑

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

  • 对象文件
  • 获取内存中的
    Hello()
    地址。您可以为此静态分析
    hello.o
    (例如使用),并获取文件中的
    hello()
    入口点偏移量
  • 将此偏移量添加到
    mmap()
    返回的地址,以获取
    Hello()
    地址
  • Hello()
    地址映射到
  • 调用函数
  • 利润

  • 你不能简单地将它们变成共享对象,并且依赖动态加载程序?@npe这是一个学术问题。我需要这样做。尝试查看
    readelf
    命令及其源代码,它应该显示如何从.o文件中提取所需信息。也许还可以查看
    dlsym
    源代码,因为这是您想要的,但是在C库中。@teppic谢谢!我想到了其他更复杂的应用程序,比如linker,但我没有想到Lighetter,比如readelf或objdump。我知道。问题是我不想链接文件,我想动态加载它(我不想使用.so)。这是一个学术问题。我需要自己实现一些“动态链接”。请明确说明您不想在问题中链接,否则我们无法知道;)这里的答案适用于给定的
    Hello()
    ,但不适用于一般情况:如果
    Hello()
    引用其他函数(例如libc函数)或全局数据,则必须应用重定位。使用
    \u线程
    数据将使事情更加复杂。@EmployeedRussian您完全正确,这就是这个例子。对于更复杂的对象文件,这比这要困难得多。在project中,如果您对更高级的示例感兴趣,其他开发人员和我会成功地为PSP控制台这样做(尽管PSP可执行文件仍然比PC的简单得多)。@m0skit0我不希望在程序之外分析文件。我不想处理所有ELF文件(带有_线程和更多特性),但我需要处理简单的ELF,而不使用objdump elfreader等等。