gcc 命令用于保持地址不变?

问题描述 投票:0回答:2

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

c assembly gcc
2个回答
4
投票

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

或者说更多“计算机化”

函数

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

函数

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

现在你修改

a()
,让它变大,假设它的大小现在是0xB00。如何将
a()
b()
保留在同一个地址中?你不能,除非你做了一些令人讨厌的技巧,比如将函数
a()
分成两部分,但我认为这不是你想要的。

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


2
投票

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

这个问题的答案告诉您一些方法。虽然这是非常不可移植的,但我相信您了解这样做的所有陷阱:)

© www.soinside.com 2019 - 2024. All rights reserved.