我一直很好奇
- 该过程在内存中的外观如何?
- 它有哪些不同的部分(部分)?
- 程序(在磁盘上)和进程(在内存中)究竟是如何相关的?
我以前的问题:有关可执行程序(进程)的内存布局的更多信息
在我的探索中,我终于找到了答案。我发现这篇出色的文章清除了我的大部分疑问:http ://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
在上面的文章中,作者展示了如何获取进程的不同段(LINUX)并将其与相应的 ELF 文件进行比较。我在这里引用本节:
想看看流程段的真实布局吗?我们可以使用 /proc//maps 文件来显示它。是我们要观察的进程的PID。在我们继续之前,我们有一个小问题。我们的测试程序运行得如此之快,以至于在我们转储相关的 /proc 条目之前它就结束了。我使用 gdb 来解决这个问题。您可以使用另一种技巧,例如在调用 return() 之前插入 sleep()。
在控制台(或终端模拟器,如 xterm)中:
$ gdb test
(gdb) b main
Breakpoint 1 at 0x8048376
(gdb) r
Breakpoint 1, 0x08048376 in main ()
按住这里,打开另一个控制台,找出程序“test”的PID。如果您想要快速的方法,请输入:
$ cat /proc/`pgrep test`/maps
您将看到如下输出(您可能会得到不同的输出):
[1] 0039d000-003b2000 r-xp 00000000 16:41 1080084 /lib/ld-2.3.3.so
[2] 003b2000-003b3000 r--p 00014000 16:41 1080084 /lib/ld-2.3.3.so
[3] 003b3000-003b4000 rw-p 00015000 16:41 1080084 /lib/ld-2.3.3.so
[4] 003b6000-004cb000 r-xp 00000000 16:41 1080085 /lib/tls/libc-2.3.3.so
[5] 004cb000-004cd000 r--p 00115000 16:41 1080085 /lib/tls/libc-2.3.3.so
[6] 004cd000-004cf000 rw-p 00117000 16:41 1080085 /lib/tls/libc-2.3.3.so
[7] 004cf000-004d1000 rw-p 004cf000 00:00 0
[8] 08048000-08049000 r-xp 00000000 16:06 66970 /tmp/test
[9] 08049000-0804a000 rw-p 00000000 16:06 66970 /tmp/test
[10] b7fec000-b7fed000 rw-p b7fec000 00:00 0
[11] bffeb000-c0000000 rw-p bffeb000 00:00 0
[12] ffffe000-fffff000 ---p 00000000 00:00 0
注意:我在每一行添加数字作为参考。
回到 gdb,输入:
(gdb) q
因此,我们总共看到 12 个段(也称为虚拟内存区--VMA)。
但我想了解 Windows Process & PE 文件格式。
- 任何用于获取 Windows 中运行进程的布局(段)的工具?
- 任何其他好的资源来学习更多关于这个主题?
编辑:
有没有好的文章显示 PE 文件sections
和 VA之间的映射segments
?