首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理ELF文件

处理ELF文件
EN

Stack Overflow用户
提问于 2013-03-23 11:58:03
回答 1查看 1.4K关注 0票数 3

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

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

代码语言:javascript
复制
int Hello() { return 3; }

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

我可能应该使用mmap或类似的东西把它装入内存。最后,我需要处理许多复杂的ELF文件,但我现在不知道如何开始。

更新:我需要像我描述的那样做这件事,因为它是为了学习目的。整个问题比我描述的要复杂得多。

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

代码语言:javascript
复制
int HelloFromElfO(const char* helloFile);

它将执行用Hello实现的helloFile函数。

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

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

UPDATE2:好吧,像readelf这样的应用程序是非常复杂的。因此,也许我尝试过这样做:让我再说一遍,我已经将hello.o映射到了ptr上的内存。如何获得指向Hello函数的指针?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-23 12:15:41

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

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

代码语言:javascript
复制
cc yourCode.o hello.o -o yourExecutable

这里

编辑

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

  1. mmap()对象文件
  2. 在内存中获取Hello()地址。您可以对hello.o进行静态分析(例如使用objdump),并在文件中获取Hello()入口点偏移量。
  3. 将此偏移量添加到mmap()返回的地址以获取Hello()地址。
  4. Hello()地址映射到函数指针
  5. 打电话给函数。
  6. ???
  7. 利润
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15586492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档