【问题标题】:Show segment addresses in gdb在 gdb 中显示段地址
【发布时间】:2021-04-28 20:32:48
【问题描述】:

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

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

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

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

#include <stdio.h>

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

【问题讨论】:

  • /proc/&lt;PID&gt;/maps 在 Linux 系统上有些相关,以查看不同的映射。但是数据和 BSS 可以是相同范围的一部分,IIRC,超过文件支持部分的末尾。根据链接描述文件,通常相对于彼此的段的布局在链接时是固定的。 (几乎总是只使用默认的ld 链接器脚本,除非您链接的是操作系统内核映像,而不是普通的可执行文件。)

标签: assembly linker gdb segment


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2014-01-29
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多