我正在尝试查找与 Ubuntu 22.04 发行版下提供的各种共享对象相关的调试符号。
例如,让我们考虑 amd64 deb 包:(libssl3
版本 3.0.2-0ubuntu1),它附带了许多剥离的共享对象。其中之一是libcrypto.so.3
。我的目标是找出这个 ELF 二进制文件的调试符号。
所以我从 Ubuntu launchpad 下载了调试符号 deb 包 - libssl3-dbgsym (关联)并提取它。我得到的是以下文件:
.
├── .build-id
│ ├── 03
│ │ └── 29a35e5964f90f62f114339b04d01fdd279556.debug
│ ├── 1a
│ │ └── eb4e8099c7be4e1f6d3a19f67f984b7f8c84f7.debug
│ ├── 4c
│ │ └── 87efff7047c22be230cee0e46e02d5381176e4.debug
│ ├── 58
│ │ └── 379515d1cca66570c1f35281cea7801b09123b.debug
│ ├── 64
│ │ └── 6eb686ac2bdfec84a935d8e87aee7b31003764.debug
│ └── 76
│ └── 600b49bcd7f52abe72e54bca385de322f175a2.debug
└── .dwz
└── x86_64-linux-gnu
├── libssl3.debug
这些调试文件对应什么ELF二进制文件.build-id
?为什么没有任何对应于libcrypto.so.3
或的调试符号libssl.so.3
?
我确实读到很多调试包是自动生成的并且可能是空的。但是,如果我能够理解这些*.debug
文件是什么以及如何使用这些符号(如果它们可以用于各种共享对象),那将会很有帮助。
答案1
调试文件对应于具有匹配构建 ID 的二进制文件。要查找构建 ID,请使用eu-readelf
(在elfutils
包中);例如,在我的系统上,
$ eu-readelf -n /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
Note section [ 1] '.note.gnu.build-id' of 36 bytes at offset 0x238:
Owner Data size Type
GNU 20 GNU_BUILD_ID
Build ID: 0c53740d5c74564b10ffdc9b15aa30961bd7221d
构建 ID 的前两个十六进制数字映射到 下的目录.build-id
,其余的映射到特定.debug
文件。