独立调试文件(ELF)
在 ELF 平台上,调试信息往往随附在可执行文件之外——存放在一个伴随的 .debug 文件中。atosl 遵循标准机制来查找它。
如何定位伴随文件
当主对象缺少 DWARF 时,atosl 会按以下顺序查找一个独立的调试文件:
.gnu_debuglink——一个节(section),其中指定了调试文件名以及一个 CRC。CRC 会被校验,因此过期或不匹配的文件会被拒绝,而不是被盲目信任。- Build-id——使用
.note.gnu.build-id在标准调试根目录下查找.build-id/xx/yyyy.debug。 - debuginfod 缓存——复用本地 debuginfod 缓存目录中已下载的工件(artifact)。
它在哪里搜索
默认情况下会查询常见的系统位置。可用 --debug-dir 添加更多根目录,该选项可重复使用:
atosl -o ./myprog -l 0x400000 \
--debug-dir /usr/lib/debug \
--debug-dir ./build/debug-symbols \
0x4011a0
每个 --debug-dir 都会被用于查找 .gnu_debuglink 的目标文件以及 build-id 布局。
CRC 很重要
.gnu_debuglink 携带了预期调试文件的 CRC。如果你手上的文件不匹配,atosl 会拒绝使用它:
.gnu_debuglink target found but CRC did not match; ignoring stale debug file
这能保护你不会悄无声息地用错误的构建去做符号化。
debuginfod
如果你已经在使用 debuginfod 并且它的客户端已经填充了本地缓存,atosl 会复用那些文件。atosl 自身不会执行网络下载;它只读取已缓存的内容。
关于 Mach-O 的说明
本章针对 ELF。对于 Apple 平台,独立调试文件的等价物是 .dSYM bundle——直接将 -o 指向它即可,如输入来源所述。另请参阅排错与限制中关于调试映射(debug map)的限制说明。