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

标签 linux gdb ptrace

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

GDB 能够跟踪 PIE - 它是如何处理的?

最佳答案

how does it deal with this?

在 Linux 上,动态加载器 ld-linux... 有一个特殊的函数:_dl_debug_state(),加载器在加载共享库之前和之后调用它,并且在设置全局变量之后:_r_debug.r_stateRT_ADDRT_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/

相关文章:

linux - 递归遍历目录 - Linux

我可以确定在使用 MSG_PEEK 成功调用 recv 后立即执行的 UDP recv 不会阻塞吗?

linux - 如果条件未检测到运算符

scope - gdb:打印不在当前范围内的变量

c - 寄存器上的 ptrace 观察点

linux - 获取没有 tmp 文件的 git 提交的文件大小

linux - 在 64 位 Linux 和 64 位处理器上运行 32 位汇编代码 : Explain the anomaly

c++ - Linux gdb 'examine' 行为

c - 使用 Ptrace 跟踪正在打开的文件的位置

linux - 使用 ptrace 设置 RIP 的奇怪行为