assembly - 在 gdb 中显示段地址
问题描述
这段youtube 视频展示了一个程序的虚拟内存的布局,其中包括从高内存地址到低内存地址的以下段。
- 核心
- 堆栈(从高地址到低地址)
- 堆(从低地址增长到高地址)
- 数据
- 文本
这些段的排列总是这样吗?它们是否独立于计算机使用的计算机体系结构?
要检查 gdb 中每个段的地址,有人可以告诉我怎么做吗?
以下面的 C 程序为例:
#include <stdio.h>
int main() {
printf("Hello World!\n");
}
解决方案
这些段的排列总是这样吗?
不。一方面,现代程序使用多个线程,这意味着有多个堆栈。另一方面,现代malloc
实现使用mmap
, 所以“堆”不是一个连续的空间,而是不相交的竞技场的集合。共享库的.text
和.data
也是随机分布的,可能在堆区域之间。
它们是否独立于计算机使用的计算机体系结构?
不会。某些架构使用向上增长的堆栈(朝向更高的地址),尽管这些架构目前很少见。
要检查 gdb 中每个段的地址,有人可以告诉我怎么做吗?
GDB 对检查段没有任何特殊支持。在 Linux 上,/proc/$pid/maps
将显示当前映射。一旦知道任何给定段的基地址,就可以使用“普通”GDBx
命令检查该地址处的内存。
推荐阅读
- date - 寻找下周三
- zend-framework2 - 更改zend应用程序但没有用
- python-3.x - 如何更改激活按钮的图像
- ios - Ionic 4 禁用 iOS 仅在一页中滑动
- spring-kafka - 为什么 gradle bdd 命令在第一次运行时不起作用
- python - 直方图未在 pandas 中指定所需的 bin
- sql - 设置太高的批量大小有什么缺点?
- c# - 在 Visual Studio 中执行“还原 Nuget 包”时未复制 Nuget 包文件
- mongodb - Mongodb根据日期查询
- javascript - 如何在 jQuery 中使用两个或多个时间选择器