与位置无关的可执行文件和ptrace

时间:2017-11-26 16:26:41

标签: linux gdb ptrace

我想在Linux上ptrace一个PIE,例如在给定的指令地址处中断。从反汇编中,我得到了指令的相对地址 - 如何找到可执行文件的加载位置,以便获得绝对地址?

GDB能够跟踪PIE - 它是如何处理这个问题的?

1 个答案:

答案 0 :(得分:2)

  

它如何解决这个问题?

在Linux上,动态加载程序ld-linux...有一个特殊的函数:_dl_debug_state(),加载程序在加载共享库之前和之后调用,并且在设置全局变量之后:{{1} } _r_debug.r_stateRT_ADD

调试器可以在该函数上设置断点,检查RT_CONSISTENT.r_state,并在此过程中发现在哪个地址加载了哪些ELF二进制文件。

该机制用于发现例如在_r_debug.r_map二进制文件受支持之前很久就加载了libc.so.6PIE二进制文件只是共享库的一个特例,因此完全相同的机制也适用于它。

这引出了一个问题:GDB如何发现PIE本身已加载的位置(因此可以设置ld-linux上的断点)。内核通过辅助向量_dl_debug_state()条目告诉它。有关辅助矢量here的更多信息。