Assembly 在gdb中显示段地址

Assembly 在gdb中显示段地址,assembly,linker,gdb,segment,Assembly,Linker,Gdb,Segment,这显示了程序虚拟内存的布局,其中包括从高内存地址到低内存地址的以下段 内核 堆栈从高地址增长到低地址 堆从低地址增长到高地址 数据 文本 这些部分的安排总是这样吗?它们是否独立于计算机使用的计算机体系结构 要检查gdb中每个段的地址,有人能告诉我怎么做吗? 以下面的C程序为例: #include <stdio.h> int main() { printf("Hello World!\n"); } 这些部分的安排总是这样吗 不。首先,现代程序使用多线程,

这显示了程序虚拟内存的布局,其中包括从高内存地址到低内存地址的以下段

内核 堆栈从高地址增长到低地址 堆从低地址增长到高地址 数据 文本 这些部分的安排总是这样吗?它们是否独立于计算机使用的计算机体系结构

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

#include <stdio.h>

int main() {
    printf("Hello World!\n");
}
这些部分的安排总是这样吗

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

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

不需要。某些架构使用的堆栈朝着更高的地址发展,尽管这些架构目前很少见

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

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

这些部分的安排总是这样吗

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

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

不需要。某些架构使用的堆栈朝着更高的地址发展,尽管这些架构目前很少见

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

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

/proc//maps在Linux系统上有一定的相关性,可以查看不同的映射。但是数据和BSS可以是同一个区段IIRC的一部分,超过文件备份部分的末尾。通常,根据链接器脚本,段之间的相对布局在链接时是固定的。除非链接的是操作系统内核映像,而不是普通的可执行文件,否则几乎总是使用默认的ld链接器脚本。/proc//maps在Linux系统上有一定的相关性,可以查看不同的映射。但是数据和BSS可以是同一个区段IIRC的一部分,超过文件备份部分的末尾。通常,根据链接器脚本,段之间的相对布局在链接时是固定的。几乎总是使用默认的ld链接器脚本,除非链接的是OS内核映像,而不是普通的可执行文件。