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,加载地址从 运行 更改为 运行。
这是我的代码:
#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,加载地址从 运行 更改为 运行。