在 gdb 中显示段地址

问题描述

这个youtube video显示一个程序的虚拟内存的布局,它包括以下从高内存地址到低内存地址的段。

  • 内核
  • 堆栈(从高地址向低地址增长)
  • 堆(从低地址增长到高地址)
  • 数据
  • 文字

这些片段的排列总是如此吗?它们是否独立于计算机使用的计算机架构?

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

#include <stdio.h>

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

解决方法

这些片段的排列总是如此吗?

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

它们是否独立于计算机使用的计算机架构?

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

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

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