Process Linux中进程的内存映射
我有下面的代码,我组装并链接这些代码,从中获得一个可执行文件Process Linux中进程的内存映射,process,linux-kernel,memory-mapping,Process,Linux Kernel,Memory Mapping,我有下面的代码,我组装并链接这些代码,从中获得一个可执行文件 .data 您好: .ascii“你好,世界” .文本 .全球启动 _开始: movl$4,%eax movl$1,%ebx movl$hello,%ecx movl$11,%edx 整型$0x80 movl $1,%eax movl $0,%ebx int $0x80 作为一个学习过程,我想看看这个过程的内存映射(通过上面的可执行文件)。pmap和cat/proc/PID/maps都需要进程id。如果是gcc编译的C程序,我可以
.data
您好:
.ascii“你好,世界”
.文本
.全球启动
_开始:
movl$4,%eax
movl$1,%ebx
movl$hello,%ecx
movl$11,%edx
整型$0x80
movl $1,%eax
movl $0,%ebx
int $0x80
作为一个学习过程,我想看看这个过程的内存映射(通过上面的可执行文件)。pmap和cat/proc/PID/maps都需要进程id。如果是gcc编译的C程序,我可以使用gdb设置断点并在另一个终端中获取PID
对于上述情况,我无法设置任何断点,因为可执行文件中没有可用的调试器符号表。有没有其他方法可以在不使用pid的情况下查看进程内存结构?我指的是加载可执行文件并转储内存结构的某种程序
谢谢你的帮助。这可能不是最聪明的方法,但如果它对你有帮助,请尝试一下 编写另一个
fork
s(保存孩子的pid)的程序,然后让孩子执行你想要运行的可执行文件。这样,您就有了程序的进程id,可以在其他终端上使用
pmap
使用GNU binutils中的readelf
在ELF头中找到入口点,然后告诉gdb
在那里放置断点
$ 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
这不适用于位置独立可执行文件(PIE),因为它们会被重新定位到不可预测的入口点。查看readelf-h
中的类型:
行。如果它说的是DYN(共享对象文件)
,那就是饼图。如果它说EXEC(可执行文件)
,那就不是馅饼