Oracle® Developer Studio 12.5:使用 dbx 调试程序

退出打印视图

更新时间: 2016 年 6 月
 
 

动态链接程序

动态链接程序(亦称 rtld、运行时 ldld.so)安排将共享对象(装入对象)引入到正在执行的程序中。rtld 在两个主要区域处于活动状态:

  • 程序启动-程序启动时,rtld 先运行,然后动态装入在链接时指定的所有共享对象。它们是预装入的共享对象,可能包括 libc.solibC.solibX.so。使用 ldd(1) 查明程序将装入哪些共享对象。

  • 应用程序请求-应用程序使用函数调用 dlopen(3) 和 dlclose(3) 来动态装入和卸下共享对象或可执行文件。

dbx 使用术语装入对象来表示共享对象 (.so) 或可执行文件 (a.out)。 可以使用 loadobject 命令列出和管理来自装入对象的符号信息。

链接映射

动态链接程序在称为 链接映射的列表中保留有所有装入对象的列表。链接映射保留在正被调试程序的内存中,可通过 librtld_db.so 这一供调试器使用的特殊系统库来间接访问它。

启动序列和 .init

.init 段是一段属于共享对象的代码,装入共享对象时该代码将执行。例如,.init 段由 C++ 运行时系统用于调用 .so 文件中的所有静态初始化函数。

动态链接程序会先在所有共享对象中映射,从而将它们置于链接映射中。然后,动态链接程序将遍历链接映射并为每个共享对象执行 .init 段。syncrtld 事件发生在这两个阶段之间。有关更多信息,请参见syncrtld 事件规范

过程链接表

过程链接表 (Procedure Linkage Table, PLT) 是 rtld 为了实现跨共享对象边界调用所使用的结构。例如,对 printf 的调用便会通过这个间接表。有关详细信息,请参见通用的及特定于处理器的 SVR4 ABI 参考手册。

要使 dbx 能够在各 PLT 中处理 stepnext 命令,它必须记录每个装入对象的 PLT 表。表信息的获得与 rtld 握手同时进行。