这是我的代码:
#include <stdio.h>
int variable;
int main(){
printf("%p", &variable);
}
两次运行输出:
~ % ./a.out
0x559bae5c4030
~ % ./a.out
0x55b9d1038030
~ %
正如你所看到的;30〃;在两个地址的末尾。符号表:
~ % readelf -s a.out | grep variable
Num: Value Size Type Bind Vis Ndx Name
51: 0000000000004030 4 OBJECT GLOBAL DEFAULT 23 variable
~ %
又是这样的";30〃;在值字段的末尾。我的问题是,值字段到底是什么?它与代码输出有什么关系?为什么每次运行都保留最后两位数字?
抱歉我的英语不好
readelf
中的Value
字段对应于可执行文件a.out
中variable
的地址。
您在输出中看到的是运行时variable
的实际加载地址。因此,您的可执行文件在第一次运行时加载在(起始地址(0x559bae5c0000
(=0x559bae5c4030
-0x4030
(。并且在第二次运行中在0x55b9d1034000
处加载(0x55b9d1038030
-0x4030
(。
您可以通过在运行时检查可执行文件a.out
的/proc/<PID>/maps
来看到这一点。
由于Linux上的地址空间布局随机化,加载地址在每次运行时都会发生变化。