linux – 为什么变量的地址在运行之间不断变化
我制作了两个C程序,它们是彼此的精确副本.使用
gcc编译器在
Linux平台(Ubuntu 10.04)上编译它们并获得两个单独的可执行文件.然后我使用objdump获取了两个可执行文件的汇编代码,发现汇编代码是完全相同,甚至两个汇编文件中相应指令的地址相同.程序是打印变量的地址.运行时程序产生不同的地址,而且每次运行时同一程序产生不同的地址.为什么两个程序中代码行的地址是相同的,但每次运行时,变量的地址甚至会改变相同的程序.我认为在屏幕上打印变量的地址是虚拟地址,但如果它的虚拟地址为什么它不能是每次都一样.通过objdump获得的汇编代码中显示的地址也是虚拟的吗?
解决方法
这是由于
address space layout randomization.
引用维基百科:
例如,当我在我的Ubuntu 10.10盒子上重复运行从以下C代码生成的相同可执行文件时: #include <stdio.h> int g = 0; int main() { int x = 0; printf("%p %pn",&x,&g); } 局部变量(x)的地址不断变化,但全局变量(g)的地址保持不变. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |