【问题标题】:Memory map of a process in LinuxLinux中进程的内存映射
【发布时间】:2012-11-22 04:32:53
【问题描述】:

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

.data

你好: .ascii“你好世界” .text

.global _start

_开始: 移动 $4,%eax 移动 $1,%ebx movl $你好,%ecx 移动 $11,%edx 整数 $0x80

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: process linux-kernel memory-mapping


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      使用 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 中的Type: 行。如果它显示DYN (Shared object file),它就是 PIE。如果显示EXEC (Executable file),则不是 PIE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-26
        • 2013-09-02
        • 2014-02-15
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多