调试 deb 包中的调试符号与哪些共享对象关联?

调试 deb 包中的调试符号与哪些共享对象关联?

我正在尝试查找与 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文件。

相关内容