c-如何在不同于预期地址的内存中加载程序



通常,用户程序二进制文件将加载在程序地址空间的低地址(通常在0x400000附近),该地址空间将在elf二进制文件中指定(在linux的情况下)。

我们是否可以强制用户二进制文件在高地址加载,可能在加载libc或其他此类库的2GB地址范围内?

我试着在网上找到一个解决方案,但找不到任何具体的解决方案。

(我在Ubuntu 12.10 64位操作系统上工作)

感谢

除非二进制文件与位置无关(PIE),否则这是不可能的。正常(非PIE)二进制文件在链接时为特定的加载地址进行硬编码,在链接过程中,重新定位到不同地址所需的信息已经丢失。

编辑:以上假设您使用的是现有的二进制文件。如果你自己制作二进制文件,你可以通过以下链接选项控制硬编码到其中的加载地址:

-Wl,-Ttext-segment,0x80000000

用您想要的地址替换0x80000000。某些地址(例如为内核保留的地址,通常从0xc0000000开始)将不起作用,并且地址必须与页对齐(最后3个十六进制数字必须为0)。

最新更新