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

what is the "Value" field in output of readelf -s

这是我的代码:

#include <stdio.h>
int variable;
int main(){
    printf("%p", &variable);
}

在 运行 秒内输出:

~ % ./a.out
0x559bae5c4030
 ~ % ./a.out
0x55b9d1038030
 ~ % 

如您所见,两个地址的末尾都有一个“30”。 和符号 table:

 ~ % readelf -s a.out | grep variable
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    51: 0000000000004030     4 OBJECT  GLOBAL DEFAULT   23 variable
 ~ % 

再次在值字段的末尾有这个“30”。 我的问题是,value 字段到底是什么,它与代码输出有什么关系?以及为什么每个 运行?

中保留最后两位数字

抱歉我的英语不好

readelf 中的 Value 字段对应于可执行文件 a.out.

variable 的地址

你在输出中看到的是 运行 时 variable 的实际加载地址。所以你的可执行文件被加载到第一个运行(=0x559bae5c4030 - 0x4030)的(起始地址)0x559bae5c0000。并在第二个 运行 中的 0x55b9d1034000 加载(0x55b9d1038030 - 0x4030)。

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

由于 Linux 上的 Address Space Layout Randomization,加载地址从 运行 更改为 运行。