什么是NT_GNU_BUILD_ID用于?

我正在阅读golang ld的帮助指南,其中一个选项是

-B value Add a NT_GNU_BUILD_ID note when using ELF. The value should start with 0x and be an even number of hex digits. 

有谁知道为什么会用这个标志?

searchNT_GNU_BUILD_ID不会提供任何有见地的答案。

这来自cmd/new5l (2015年2月) 从C到Go的大规模转换 ,由src/cmd/ld/pobj.c

该信息是在提交7d507dc6e (2013年12月,对于Go 1.3)中引入的,为新的链接器结构

NT_GNU_BUILD_ID 在这里被称为唯一的构建ID位串。
你可以看到它在Fedora发行版中的应用

要将ID嵌入到已剥离的对象及其.debug文件中,我选择使用ELF注释部分。
当其类型为SHT_NOTE时, strip等可以保持这两个文件的SHT_NOTE

新的部分是正式名为.note.gnu.build-id ,但名称不是规范的,该部分可以与其他SHT_NOTE部分合并。
对于构建ID注释,ELF注释标题的名称为“ GNU ”,类型3( NT_GNU_BUILD_ID ),其链接对象(或.ko样式的ET_REL文件)中只能有一个。

你可以在2007年的补丁中看到它:

这个补丁为ELF目标添加了一个新选项--build-id
它生成一个包含由ld选择的“ unique build ID ”位的合成ELF注释部分。

这是作为一个ld选项来完成的,为了使每个编译(vs一些脚本添加一个生成的对象到链接)是高效和万无一失的。
它是这样完成的,所以它可以使用不多于或少于输出的精确最终ELF位来选择唯一的ID。

这是确保确定性ID生成风格(即密码哈希)总是能够为重复精确复制的结果产生相同结果的最佳方式。