首页 > 解决方案 > readelf -s 输出中的“值”字段是什么

问题描述

这是我的代码:

#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
 ~ % 

在 Value 字段的末尾还有这个“30”。我的问题是,该字段到底是什么,它与代码的输出有什么关系?为什么每次运行都保留最后两位数字?

对不起我糟糕的英语

标签: clinuxelfreadelf

解决方案


Valuefrom 字段readelf对应variable于可执行文件中的地址a.out

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

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

由于Linux 上的地址空间布局随机化,加载地址会随着运行而变化。


推荐阅读