优雅的方式来使用Linux的binutils设置ELF映像的基地址?(Elegant way to

2019-07-21 06:13发布

对于一个个人项目,我需要编写一个加载在一个非默认的内存地址的可执行文件。 从这个SO问题 ,我知道我可以为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文件自己不会是世界末日,但似乎喜欢这个功能应该存在的地方。

Answer 1:

小精灵切入点可以在链接响应文件,可以通过与-T到LD设置

这样做有--verbose虚假链接会显示默认链接responsefile(这可能是系统特定的,但在现实中却并不坏,每OS拱一个为最)。

请注意,可能会有额外的限制(如居住在一个文本/代码段的入口点)

对于沿定义链接文件拖着的一个实际的例子,看到的Free Pascal项目,这样做是为了实现资源。



文章来源: Elegant way to set base address of ELF image with Linux binutils?