我想在 Linux 上跟踪 PIE,例如在给定的指令地址中断。从反汇编中,我得到了指令的相对地址 - 如何找出可执行文件的加载位置,以便获得绝对地址?
GDB 能够跟踪 PIE - 它是如何处理的?
最佳答案
how does it deal with this?
在 Linux 上,动态加载器 ld-linux...
有一个特殊的函数:_dl_debug_state()
,加载器在加载共享库之前和之后调用它,并且在设置全局变量之后:_r_debug.r_state
到 RT_ADD
或 RT_CONSISTENT
。
调试器可以在该函数上设置断点,检查 .r_state
和 _r_debug.r_map
,并在此过程中发现在哪个地址加载了哪些 ELF 二进制文件。
此机制用于发现位置,例如libc.so.6
早在 PIE
二进制文件受支持之前就已加载。 PIE
二进制文件只是共享库的一个特例,因此完全相同的机制也适用于它。
这引出了一个问题:GDB 如何发现 ld-linux
本身被加载的位置(因此可以在 _dl_debug_state()
上设置断点)。内核通过辅助向量 AT_BASE
条目告诉它。有关辅助矢量的更多信息 here .
关于linux - 与位置无关的可执行文件和 ptrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47498350/