You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86架构下CPU如何定位全局/静态对象?

x86架构下CPU如何定位全局/静态对象?

嘿,你观察得真细致!你的疑问特别切中要害——既然栈上对象靠栈指针寻址,那全局/静态对象的硬编码地址遇上ASLR岂不是直接失效?其实这里面藏着操作系统和编译器/链接器的协同机制,咱们一步步说:

首先,全局和静态对象在编译链接阶段,并不会被分配绝对的虚拟地址,编译器只会给它们分配相对虚拟地址(RVA)——也就是相对于程序基地址的偏移量,这些信息会被存在可执行文件的重定位表里。

当程序被操作系统加载到内存时,ASLR会给整个进程分配一个随机的基地址。这时候加载器会做一件关键的事:遍历重定位表,把所有全局/静态对象的RVA加上这个随机基地址,计算出它们实际的虚拟地址,然后把二进制指令里原来的硬编码偏移量替换成最终的地址。比如你看到的lea eax, [0x1000],加载后可能就变成了lea eax, [0x501000](假设基地址是0x500000),这样CPU执行时用的就是正确的地址了。

另外,在x86-64架构下,编译器现在更常用RIP相对寻址来访问全局对象,比如指令lea rax, [rip + 0x1234]。这种方式更巧妙:RIP是当前指令的地址,已经被ASLR调整过了,而后面的偏移量是编译时确定的固定值,两者相加直接就是全局对象的实际地址,根本不需要加载器修改指令——既高效又完美适配ASLR,一举两得。

至于你从反汇编里看到的“硬编码值”,那其实是编译后的原始偏移量(或者RVA),并不是程序运行时真正使用的地址。加载器早就帮咱们把地址修正好了,所以ASLR完全不会破坏全局对象的寻址逻辑~

备注:内容来源于stack exchange,提问作者Badasahog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:59:38