C - readelf -s 输出中的"Value"字段是什么



这是我的代码:

#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.outvariable的地址。

您在输出中看到的是运行时variable的实际加载地址。因此,您的可执行文件在第一次运行时加载在(起始地址(0x559bae5c0000(=0x559bae5c4030-0x4030(。并且在第二次运行中在0x55b9d1034000处加载(0x55b9d1038030-0x4030(。

您可以通过在运行时检查可执行文件a.out/proc/<PID>/maps来看到这一点。

由于Linux上的地址空间布局随机化,加载地址在每次运行时都会发生变化。

最新更新