Oracle Solaris Studio 12.2:使用 dbx 调试程序

动态链接程序

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

dbx 使用术语装入对象 来表示共享对象 (.so) 或可执行文件 (a.out)。可以使用 loadobject 命令(请参见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 握手同时进行。