进程的内存映像
在阅读《》的第 14 章时,看到一个“打印不同类型的数据所存放的位置”的例子,它非常清晰地从程序内部反应了“进程的内存映像”,通过结合它与《Gcc 编译的背后》和的相关内容,可以更好地辅助理解相关的内容。
进程内存映像表
首先回顾一下中提到的”进程内存映像表”,并把共享内存的大概位置加入该表:
该程序的运行结果如下:
上述运行结果反应了几个重要部分数据的大概分布情况,比如 data
段(那个初始化过的全局变量就位于这里)、bss 段、stack、heap,以及 shared memory 和main(代码段)的内存分布情况。
在程序内部获取完整内存分布信息
不过,这些结果还是没有精确和完整地反应所有相关信息,如果要想在程序内完整反应这些信息,结合,就不难想到,我们还可以通过扩展一些已经链接到可执行文件中的外部符号来获取它们。这些外部符号全部定义在可执行文件的符号表中,可以通过 等查看到,例如:
运行结果:
上述程序完整地勾勒出了进程的内存分布的各个重要部分,这样就可以从程序内部获取跟程序相关的所有数据了,一个非常典型的例子是,在程序运行的过程中检查代码正文部分是否被恶意篡改。
如果想更深地理解相关内容,那么可以试着利用 readelf
, 等来分析 ELF 可执行文件格式的结构,并利用 gdb
来了解程序运行过程中的内存变化情况。