我试图理解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中的加载段匹配。如何从可执行文件提示。
答案 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
部分,并拥有运行时的内容。