3

我试图了解 GDB 命令背后的内部工作。在了解了精灵/共享库/地址空间随机化的初步功课之后,我试图了解 GDB 如何在可执行文件和核心文件之间发挥作用。

solib.c 包含共享库处理的实现。Esp 对 info sharedlibrary 命令很感兴趣。

solib.c 上的评论是这样的..

 
 /* Relocate the section binding addresses as recorded in the shared
 object's file by the base address to which the object was actually
 mapped.  */

 ops->relocate_section_addresses (so, p); 

 

我不能从这个评论中理解太多。有人可以用简单的英语向我解释搬迁是如何发生的吗?即每次可执行文件加载共享对象时,它都会加载到某个位置,比如 X,共享库中的所有符号都将位于固定偏移量,比如 X+Y,大小为 Z。我的问题是, gdb如何进行相同范围的地址重定位,以便与corefile中的加载段匹配。它如何从可执行文件中获取该提示。

4

1 回答 1

3

gdb如何进行相同范围的地址重定位,使其与corefile中的加载段匹配

换句话说,GDB 是如何找到重定位的X

答案取决于操作系统。

在 Linux 上,GDB在文件中查找 s_DYNAMIC[]数组,其中包含一个带有.struct Elf{32,64}_Dyncore.d_tag == DT_DEBUG

.d_ptr元素中的 指向struct r_debug(参见/usr/include/link.h),它指向 s 的链表struct link_map,它描述了所有加载的共享库及其在 中的重定位l_addr

GDB 中的相关文件是solib-svr4.c.

编辑:

我看到了,核心文件中没有 .dynamic 部分。

不应该有。.dynamic可执行文件中有一个部分,其中一个匹配的LOADcore(该段将“覆盖”该.dynamic部分,并具有运行时存在的内容)。

于 2014-02-17T06:21:10.020 回答