关于保持地址不变的 c:gcc 命令?

gcc command for keeping addresses as they were?

有没有办法在每次编译程序时保持所有函数和变量的偏移量不变?


没有。这不是编译器本身的限制,而是"逻辑"限制。想象一下,你有一个装满东西的盒子。现在你想在盒子 A 上添加东西,但你不想要一个新盒子。好吧,你不能,这是一个物理限制。

或者说更多"计算机化":

函数a()占用地址0到0xA00(大小为0xA00)

函数b()占用地址0xA01到0xB00(大小0x100)

现在你修改 a() 使它更大,假设它的大小现在是 0xB00。您如何将 a()b() 保存在同一个地址中?除非你做一些讨厌的技巧,比如将函数 a() 分成两部分,否则你不能这样做,但我认为这不是你想要的。

这并没有考虑现代操作系统具有 ASLR 和其他安全方法。


是的,不是的。不,因为 m0skit0 所说的。是的,因为您可以告诉链接器在指定地址设置某些符号 - 至少我知道 GCC 的端口可以用于各种嵌入式目标。使用这种技术的代码比较常见,例如从稍后加载的模块加载固件或类似的东西。

这个问题的答案告诉你一些方法来做到这一点。虽然这是非常不便携的,但我相信你明白这样做的所有陷阱:)