1

我有以下代码,我组装并链接以从中获取可执行文件。

.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 的情况下查看进程内存结构?我的意思是某种加载可执行文件并转储内存结构的程序。

谢谢您的帮助。

4

2 回答 2

1

这可能不是最聪明的方法,但如果对您有帮助,请尝试一下。

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

于 2012-11-22T09:47:58.860 回答
1

使用readelfGNU binutils 来查找 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),因为它们会重新定位到不可预测的入口点。看Type:线从readelf -h。如果它说DYN (Shared object file),它是 PIE。如果它说EXEC (Executable file),它不是 PIE。

于 2016-09-24T22:02:10.470 回答