【问题标题】:What parts of ELF file should be loaded in to the memory?应该将 ELF 文件的哪些部分加载到内存中?
【发布时间】:2013-05-30 15:39:32
【问题描述】:

我正在编写一个获取 elf 文件、加载它然后执行它的 c 程序。我已经阅读了所有的标题(elf、section、program、relocation)。下一部分应该是获取要加载的内容,对吧?

我该如何进行?据我了解,我应该得到 LOAD、ALLOC 和 EXECINST 类型的部分还是 LOAD 类型的程序段?还是什么?

当我得到所需的数据时,我应该使用 mmap() 将其映射到内存中。

我已经多次阅读 ELF 文档,但我仍然不知道如何继续。非常感谢任何和所有帮助。

【问题讨论】:

  • 为什么要这样做呢?操作系统会为您完成。只需将文件作为程序执行(exec () 用于 POSIX)。
  • 这些是项目的规格。我不能使用 exec()。这个项目的重点是熟悉elf文件,加载和重定位。

标签: c elf sections


【解决方案1】:

只需要加载PT_LOAD 段。但是,为可能需要在固定地址加载的主程序加载它们会很复杂,因为您的加载器可能已经将该地址范围的部分或全部用于其他目的。你可以作弊,给你的加载器一个与“典型”主程序地址不同的基地址,希望它能正常工作,或者你可以制作一个可重定位的加载器,将自己重定位到不同的地址。

【讨论】:

  • 所以我不需要加载任何部分?还是我可以在加载部分或段之间进行选择,但不能同时加载?我肯定会做一个可重定位的装载机,因为我猜它更安全?
  • 对于可执行程序,只有 program 标头 (PT_*) 是相关的。节标题甚至不需要存在;它们供链接器(处理.o 文件)或调试器(在可执行文件中)使用。
【解决方案2】:

这是由操作系统本身完成的。只需要执行二进制文件。更详细的参考Linux动态链接模块的源码。

【讨论】:

  • 我是 Linux 的新手(两天前安装了 ubuntu)。我从哪里(或如何)获得源代码?
  • 谢谢。如果这能解决我的问题,我会接受你的回答。 [:
猜你喜欢
  • 2012-05-12
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2022-08-18
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多