【问题标题】:Elegant way to set base address of ELF image with Linux binutils?使用 Linux binutils 设置 ELF 映像基地址的优雅方法?
【发布时间】:2013-02-24 12:17:50
【问题描述】:

对于个人项目,我需要编写一个在非默认内存地址加载的可执行文件。从this SO question,我知道我可以为 ELF 设置入口地址并手动修改节地址,以便可执行文件有效地基于我选择的某个地址。但是,答案表明这仅在我不进行 glibc 初始化(我需要此项目)的情况下才有效,并且每次编译时都设置段内存地址会很困难(更不用说乏味了)。

似乎应该有更好的方法在构建时为 ELF 设置基地址,但如果需要,我会在构建后使用脚本手动进行。 ld 的这个选项如果不是特定于 PE 端口,那将是完美的:

--image-base value
  Use value as the base address of your program or dll. This is the lowest 
  memory location that will be used when your program or dll is loaded. To 
  reduce the need to relocate and improve performance of your dlls, each should 
  have a unique base address and not overlap any other dlls. The default is 
  0x400000 for executables, and 0x10000000 for dlls. [This option is specific 
  to the i386 PE targeted port of the linker]

我还没有找到等效的 ELF。不存在吗?自己解析 ELF 文件不会是世界末日,但似乎这个功能应该存在于某个地方。

【问题讨论】:

  • 转储内置链接器响应文件,对其进行修改并将其作为链接器参数传递给 gcc(进而传递给 ld)?
  • @MarcovandeVoort 对ldgcc 的快速谷歌搜索没有产生任何结果。您能否详细说明或指导我查看正确的文档?
  • 为什么需要“在非默认内存地址加载”?也许您可以以不同的方式实现您的初始目标....
  • 您可以使用 -T 将链接描述文件传递给 ld。您可以通过使用 ld -verbose 进行虚假链接来查看内置脚本
  • @MarcovandeVoort 谢谢!它现在有点工作,虽然我尝试的一些地址似乎工作(如0x2000000x500000)但不是其他地址(如0x100000);当它不起作用时,程序被杀死。我可以使用哪些地址(内核空间地址除外)是否有某种限制?

标签: linux linker ld binutils


【解决方案1】:

ELF入口点可以在链接器响应文件中设置,可以用-T传递给ld

使用 --verbose 进行虚假链接将向您显示默认链接器响应文件(可能是特定于系统的,但实际上并没有那么糟糕,每个操作系统每个拱门一个)。

请注意,可能存在其他约束(例如位于文本/代码段中的入口点)

有关拖拽自定义链接器文件的实际示例,请参阅 Free Pascal 项目,该项目这样做是为了实现资源。

【讨论】:

  • -v 只是打印出版本。请改用--verbose。 (这会导致大量输出,因此您可以通过less 进行管道传输)
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多