ksp*_*swa 5 c linux gdb coredump shared-libraries
我试图了解 GDB 命令背后的内部工作原理。在了解 elf/共享库/地址空间随机化的初步作业之后,我尝试了解 GDB 在可执行文件和核心文件之间的意义。
solib.c 包含共享库处理的实现。特别是我对 info sharelibrary 命令感兴趣。
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中的加载段匹配。它如何从可执行文件中获取该提示。
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),它指向struct link_maps 的链接列表,它描述了所有加载的共享库及其在 中的重定位l_addr。
GDB中的相关文件是solib-svr4.c.
编辑:
我看到,核心文件中没有 .dynamic 部分。
不应该有。.dynamic可执行文件中有一个部分,并且有一个匹配的LOAD段core(该段将“覆盖”该.dynamic部分,并具有运行时的内容)。
| 归档时间: |
|
| 查看次数: |
2101 次 |
| 最近记录: |