Linux中进程的内存映射

时间:2012-11-22 04:32:53

标签: process linux-kernel memory-mapping

我有以下代码,我汇编并链接以获取可执行文件。

.data

您好:     .ascii“Hello World” 的.text

.global _start

_start:     movl $ 4,%eax     movl $ 1,%ebx     movl $ hello,%ecx     movl $ 11,%edx     int $ 0x80

movl $1,%eax
movl $0,%ebx
int $0x80

作为一个学习过程,我想查看进程的内存映射(通过上面的可执行文件)。 pmap和cat / proc / PID / maps都需要进程ID。如果它是一个gcc编译的C程序,我可以使用gdb来获得断点并在另一个终端中获取pid。

对于上述情况,我无法设置任何断点,因为可执行文件中没有可用的调试器符号表。有没有其他方法可以在不使用pid的情况下查看进程内存结构?我的意思是某种加载可执行文件并转储内存结构的程序。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这可能不是最聪明的方法,但如果能帮到你的话,试一试。

编写另一个程序fork s(保存孩子的pid),然后让孩子exec成为你想要运行的可执行文件。
你去,你有程序的进程ID在其他终端使用pmap

答案 1 :(得分:1)

使用GNU binutils中的string url查找ELF头中的入口点,然后告诉readelf在那里放置一个断点。

gdb

这不适用于与位置无关的可执行文件(PIE),因为它们会重新定位到不可预测的入口点。查看$ readelf -h /bin/true ... Entry point address: 0x10000c5c ... $ gdb /bin/true ... (gdb) break *0x10000c5c Breakpoint 1 at 0x10000c5c (gdb) run Starting program: /bin/true ... Breakpoint 1, 0x10000c5c in ?? () (gdb) ^Z [1]+ Stopped gdb /bin/true $ ps ... 744 tty1 00:00:00 true ... $ less /proc/744/maps 中的Type:行。如果它显示readelf -h,那就是PIE。如果它显示DYN (Shared object file),那就不是PIE。