每次我编译程序时,有没有办法保持所有函数和变量的偏移量?
答案 0 :(得分:4)
没有。这不是编译器本身的限制,而是“逻辑”限制。想象一下,你有一个装满东西的盒子。现在你想在盒子A上添加东西,但你不想要一个新的盒子。好吧,你不能,这是一个物理限制。
或者说更多“computerish”:
函数a()
占用地址0到0xA00(大小0xA00)
函数b()
占用地址0xA01到0xB00(大小0x100)
现在你修改a()
以便它更大,让我们说它的大小现在是0xB00。您如何将a()
和b()
放在同一地址?除非你做一些讨厌的技巧,比如将函数a()
分成两部分,否则你不能这样做,但我认为这不是你想要的。
这不考虑现代操作系统有ASLR和其他安全方法。
答案 1 :(得分:2)
是和否。不,因为m0skit0说的是什么。是的,你可以告诉链接器在指定的地址设置某些符号 - 至少我知道GCC的端口可以用于各种嵌入式目标。看到使用这种技术的代码从后来加载的模块或类似的模块加载固件是相对频繁的。
this question的答案告诉你一些方法。这是非常不便携的,但我确信你理解这样做的所有陷阱:)