c - 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”。我的问题是,该值字段到底是什么,它与代码的输出有什么关系?为什么每次运行都保留最后两位数字?
对不起我糟糕的英语
解决方案
Value
from 字段readelf
对应variable
于可执行文件中的地址a.out
。
您在输出中看到的是variable
运行时实际加载的地址。0x559bae5c0000
因此,您的可执行文件在第一次运行 ( = 0x559bae5c4030
- ) 时加载到 (起始地址0x4030
)。0x55b9d1034000
并在第二次运行 ( 0x55b9d1038030
- 0x4030
)时加载。
您可以通过在运行时检查/proc/<PID>/maps
可执行文件来看到这一点。a.out
由于Linux 上的地址空间布局随机化,加载地址会随着运行而变化。
推荐阅读
- c# - 与 html helper chechkboxfor 一起使用时,Bootstrap toggle chechkbox 不起作用?
- pjsip - 如何处理 pjsip 消息?
- python - 在 IDLE 中的会话之间保存命令历史记录
- sql-server - SQL Server 中的实体框架 + 列的平均部分
- c++ - 在 C++ 中打开文件时出现分段错误
- javascript - 将 ltr 提供给 MDC 开关在 rtl MDC 抽屉内不起作用
- spring - 是在启动 Spring Boot 应用程序 2+ 时进行线程转储吗?我如何停止或禁用它?
- amazon-redshift - 如何找到授予 Redshift 权限的时间戳?
- javascript - 无论如何要在 Chrome 中请求更高的 localStorage 限制而不进行扩展(从 Javascript 或用户手动从 Chrome UI)?
- pandas - 根据 pandas 数据框的列名和值创建字典