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(可执行文件)
,那就不是馅饼