首页 > 解决方案 > 在 gdb 中显示段地址

问题描述

这段youtube 视频展示了一个程序的虚拟内存的布局,其中包括从高内存地址到低内存地址的以下段。

这些段的排列总是这样吗?它们是否独立于计算机使用的计算机体系结构?

要检查 gdb 中每个段的地址,有人可以告诉我怎么做吗?
以下面的 C 程序为例:

#include <stdio.h>

int main() {
    printf("Hello World!\n");
}

标签: assemblylinkergdbsegment

解决方案


这些段的排列总是这样吗?

不。一方面,现代程序使用多个线程,这意味着有多个堆栈。另一方面,现代malloc实现使用mmap, 所以“堆”不是一个连续的空间,而是不相交的竞技场的集合。共享库的.text.data也是随机分布的,可能在堆区域之间。

它们是否独立于计算机使用的计算机体系结构?

不会。某些架构使用向上增长的堆栈(朝向更高的地址),尽管这些架构目前很少见。

要检查 gdb 中每个段的地址,有人可以告诉我怎么做吗?

GDB 对检查段没有任何特殊支持。在 Linux 上,/proc/$pid/maps将显示当前映射。一旦知道任何给定段的基地址,就可以使用“普通”GDBx命令检查该地址处的内存。


推荐阅读