GDB如何执行共享库的基址[info sharedlibrary命令的内部]

时间:2014-02-16 12:53:47

标签: linux gdb shared-libraries core relocation

我试图理解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中的加载段匹配。如何从可执行文件提示。

1 个答案:

答案 0 :(得分:2)

  

gdb如何进行相同范围的地址重定位,以便与核心文件中的加载段匹配

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

答案取决于操作系统。

在Linux上,GDB在_DYNAMIC[]文件中找到struct Elf{32,64}_Dyn core个数组,其中包含.d_tag == DT_DEBUG的元素。

该元素中的.d_ptr指向struct r_debug(请参阅/usr/include/link.h),其中指向struct link_map的链接列表,其中描述了所有已加载的共享库及其l_addr中的重新定位。

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

编辑:

  

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

不应该。可执行文件中有.dynamic部分, LOAD中的匹配core段(该段将“覆盖”.dynamic部分,并拥有运行时的内容。