NT_GNU_BUILD_ID用于什么?

fab*_*ioM 5 linux gnu go

我正在阅读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.
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么要使用该标志?

搜索NT_GNU_BUILD_ID没有提供任何有见地的答案。

Von*_*onC 5

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

该信息已在提交7d507dc6e(对于Go 1.3,2013年12月)中进行了介绍,这是对新链接程序结构的准备

NT_GNU_BUILD_ID这里提到作为一个独特的版本ID位串。
您会在Fedora发行版中看到它的使用

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

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

您可以在2007年的此修补程序中看到它:

此补丁ld为ELF目标添加了一个新选项--build-id
它生成一个合成的ELF音符部分,其中包含unique build ID由“ ”选择的位ld

这样做是ld为了提高效率和万无一失,以使其能够进行每次编译(相对于某些脚本将生成的对象添加到链接中)来实现。
这样做的方式是这样,它可以使用不超过且不小于输出的最终ELF位来帮助选择唯一ID。

这是确保ID生成的确定性样式(即加密哈希)对于精确复制的重复构建始终产生相同结果的最佳方法。