ELF 的 gnu_debuglink 部分给了我一个奇怪的名字

ELF's gnu_debuglink section gives me weird name

我用过 Ubuntu 20.04.3,当我 运行

readelf  --string-dump=.gnu_debuglink /usr/bin/cp

我得到了奇怪的调试文件名,同时期待 cp.debug

String dump of section '.gnu_debuglink':
  [     0]  674b3a5e9ca27e34cf3517aa997ba91ce6e0a0.debug
  [    31]  k`-

这是原图Ubuntu,没有任何修改。 这有什么原因吗?

I got weird debug filename while expecting something like cp.debug

这个名字没什么奇怪的。

有两种常用方案可将程序与该程序的调试信息相关联 -- 程序名称或其链接器 build-id。

您可以通过 readelf -n /usr/bin/cp 找到链接器 build-id。这是我系统上的输出:

Displaying notes found in: .note.gnu.build-id
  Owner                Data size        Description
  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)         Build ID: 2f6b630344b1b72875f756dce05a40186d18c6d8

Displaying notes found in: .note.ABI-tag
  Owner                Data size        Description
  GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)            OS: Linux, ABI: 3.2.0

很可能,您的 cp 版本的链接器 build-id 是 674b3a5e9ca27e34cf3517aa997ba91ce6e0a0

使用链接器 build-id 对于可以出现在多个不同名称下的程序特别方便(如果仅使用程序名称,您将不得不创建调试信息的多个副本(或链接))。

此外,如果程序更新,其链接器 build-id 将会更改,因此调试器不可能加载“过时”的调试信息。