c - 使用 ELF 文件

标签 c linux elf

我需要在我的 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.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. 利润

关于c - 使用 ELF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586492/

相关文章:

linux - 如何从亚马逊EC2实例下载网站文件和数据库?

c++ - 在两个终端之间传递缓冲区(命名管道)

linux - 如何强制 bash 向另一个进程传递信号?

c++ - 有没有办法使用核心文件找到泄漏的内存?

c - 如何有效地解析c中的字符串

javascript - 哪个 C 库具有执行 zsh 的递归 glob 的功能?

linux - cut 和 dd 在二进制文件上的不同结果

x86-64 - **ELF**中的@object是什么

c - 当我们在C套接字编程中使用accept()和connect()时,主机端口号是多少

c - C 中隐式转换为 double