【发布时间】:2021-04-28 20:32:48
【问题描述】:
这个youtube video显示了一个程序的虚拟内存的布局,它包括以下从高内存地址到低内存地址的段。
- 内核
- 堆栈(从高地址向低地址增长)
- 堆(从低地址增长到高地址)
- 数据
- 文字
这些段的排列总是这样吗?它们是否独立于计算机使用的计算机架构?
要检查 gdb 中每个段的地址,有人可以告诉我怎么做吗?
以如下C程序为例:
#include <stdio.h>
int main() {
printf("Hello World!\n");
}
【问题讨论】:
-
/proc/<PID>/maps在 Linux 系统上有些相关,以查看不同的映射。但是数据和 BSS 可以是相同范围的一部分,IIRC,超过文件支持部分的末尾。根据链接描述文件,通常相对于彼此的段的布局在链接时是固定的。 (几乎总是只使用默认的ld链接器脚本,除非您链接的是操作系统内核映像,而不是普通的可执行文件。)
标签: assembly linker gdb segment