c - 如何将程序加载到内存中与预期地址不同的地址?

标签 c linux compiler-construction linker ld

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

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

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

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

谢谢

最佳答案

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

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

-Wl,-Ttext-segment,0x80000000

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

关于c - 如何将程序加载到内存中与预期地址不同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20234148/

相关文章:

c - 大浮点和的精度

c - 识别 C 程序中函数的开始和结束

c - 如何在二进制代码中找到函数边界

compiler-construction - clojure 程序/编译器/解释器实际上如何 "work"?

表达式评估中的编译器差异

c - RSA 加密/解密

c - 如果已知 salt 和密码哈希,则暴力强制 crypt()?

c++ - 如何在 Linux 中验证主机名\域名 - C++

linux - 哪个是从日志文件中查找攻击的最佳算法

linux - 我的服务器的总内存与 USED + FREE 内存不匹配。我正在使用 linux free 命令