我有以下代码,我汇编并链接以获取可执行文件。
.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的情况下查看进程内存结构?我的意思是某种加载可执行文件并转储内存结构的程序。
感谢您的帮助。
答案 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。