【问题标题】:How to load a program in memory at a different address than it is intended for?如何将程序加载到内存中与预期不同的地址?
【发布时间】:2013-11-27 04:49:33
【问题描述】:

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

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

我已经尝试在网上找到解决方案,但找不到任何具体的解决方案。

(我正在使用 Ubuntu 12.10 64 位操作系统)

谢谢

【问题讨论】:

标签: c linux compiler-construction linker ld


【解决方案1】:

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

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

-Wl,-Ttext-segment,0x80000000

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多