dbx 允许您在 objcopy 命令(在 Linux 平台上)和 gobjcopy 命令(在 Oracle Solaris 平台上)中使用选项,将调试信息从可执行文件复制到独立的调试文件、从可执行文件中删除该信息,以及在这两个文件之间创建链接。
dbx 按照以下顺序搜索独立的调试文件,并从找到的第一个文件中读取调试信息:
包含可执行文件的目录。
包含可执行文件的目录中名为 debug 的子目录。
全局调试文件目录的子目录;如果 dbxenv 变量 debug_file_directory 设置为该目录的路径名,您可以查看或更改该目录。环境变量的缺省值为 /usr/lib/debug。
例如,以下过程介绍了如何为可执行文件 a.out 创建独立的调试文件。
objcopy --only-keep-debug a.out a.out.debug
objcopy --strip-debug a.out
objcopy --add-gnu-debuglink=a.out.debug a.out
在 Oracle Solaris 平台上,使用 gobjcopy 命令。在 Linux 平台上,使用 objcopy 命令。
在 Linux 平台上,可以使用 objcopy –help 命令来确定该平台是否支持 –add-gnu-debuglink 选项。可以使用 cp a.out a.out.debug 命令替换 objcopy 命令的 –only-keep-debug 选项,以便使 a.out.debug 成为完全可执行文件。
缺省情况下,装入对象包含可分配和不可分配节。可分配节是包含可执行代码和运行时该代码需要的数据的节。不可分配节包含补充信息,在运行时执行文件时这些信息不是必需的。这些节用于支持调试器和其他观察工具的操作。在运行时操作系统不会将对象中的不可分配节装入内存,因此,无论其大小如何,都不会影响内存使用或运行时性能的其他方面。
为方便起见,可分配节和不可分配节通常保留在同一文件中。但是,在某些情况下,将这些节分开会很有用。尤其是对高度优化的代码进行细粒度调试需要大量的调试数据。在现代系统中,调试数据可能很轻易地就大于其所描述的代码。32 位对象的大小限制为 4 GB。在非常大的 32 位对象中,调试数据可能会导致超出此限制,并阻止创建对象。
过去,为了解决这些问题,装入对象被剥离了若干不可分配节。剥离很有效,但是会销毁以后可能需要的数据。而 Oracle Solaris 链接编辑器可以将不可分配节写入辅助文件。此功能可通过 –z ancillary 命令行选项启用。
% ld ... –z ancillary[=outfile] ... /* Your file is separated into a.out and b.out, where a.out: ELF 32-bit LSB executable 80386 Version 1 [FPU], dynamically linked, not stripped, ancillary object b.out b.out: ELF 32-bit LSB ancillary 80386 Version 1, primary object a.out */
缺省情况下,辅助文件和主输出对象同名,具有 .anc 文件扩展名。但是,可以将 outfile 值提供给 –z ancillary 选项来指定一个不同的名称。
指定了 –z ancillary 时,链接编辑器将执行以下操作。
将所有可分配节写入主文件。此外,将包含一个或多个设置了 SHF_SUNW_PRIMARY 节头标志的输入节的所有不可分配节写入主文件。
将所有其余的不可分配节写入辅助文件。
两个输出文件均收到以下已知的不可分配节完全相同的副本:
节名称字符串表。
完整非动态符号表。
与 .symtab 关联的符号表扩展索引节。
与 .symtab 关联的非动态字符串表。
包含标识主对象、所有辅助对象和要检查的对象所需的信息。
主文件和所有辅助文件包含相同的节头数组。每个节在每个文件中具有相同的节索引。
尽管主文件和辅助文件均定义了相同的节头,但大多数节的数据将写入单个文件中,如上所述。如果给定文件中不存在某个节的数据,则会设置 SHF_SUNW_ABSENT 节头标志,且 sh_size 字段将为 0。
通过检查单个文件,该组织可获取节头的完整列表、完整的符号表以及主文件和辅助文件的完整列表。
然后,通过查找可执行文件中的辅助文件,dbx 可以如同 dbx 使用独立的调试文件一样使用这些辅助文件。按如下方式进行编译时,请使用 –z ancillary 选项:
%CC -g -z ancillary=a.out demo.cpp //"a.out" contains the ancillary object
主装入对象和所有相关的辅助文件包含一个允许标识所有装入对象并将其关联在一起的 .SUNW_ancillary 节。
有关更多信息,请参见Oracle Solaris 11.2 链接程序和库指南 中的第 2 章 链接编辑器。