如何用objdump获取C程序全局变量指针地址?为何运行时地址变化?
全局变量target地址差异问题解答
objdump -t输出的0000000000004014是链接阶段分配的虚拟偏移地址,不是程序运行时的实际有效地址。这个地址是链接器假设程序会加载到某个固定基址时给出的相对偏移量。- 运行时
printf("%p", &target)输出的是进程当前运行空间的实际虚拟地址,每次启动地址不同是因为系统开启了ASLR(地址空间布局随机化)——这是现代操作系统的安全机制,会在程序每次启动时随机化进程内存区域(包括全局变量所在的数据段)的加载基址,以此防范内存溢出类攻击。 - 两者的对应关系:运行时实际地址 = 数据段的随机加载基址 +
objdump给出的偏移地址。你可以关闭ASLR验证:- Linux下执行命令
sudo sysctl -w kernel.randomize_va_space=0关闭ASLR,重新运行程序后,&target的输出会和objdump -t中的地址完全一致。
- Linux下执行命令
- 你遗漏的核心点就是ASLR机制,以及链接地址与运行时加载地址的本质区别:链接地址是固定基址下的偏移值,而现代系统会通过随机化基址改变最终的运行时绝对地址。
内容的提问来源于stack exchange,提问作者Y_Z
相关产品推荐
相关产品推荐

