NT_GNU_BUILD_ID是用来做什么的?

8
我正在阅读 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.

请问有人知道为什么要使用那个标志吗?

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

1个回答

8
这段内容来源于2015年2月C语言到Go语言的大规模转换中cmd/new5l, 翻译自src/cmd/ld/pobj.c
这个信息是在提交7d507dc6e中引入的(为Go 1.3,于2013年12月),为新链接器结构做准备。

NT_GNU_BUILD_ID是一个唯一的构建ID比特串,在这里提到
例如,在Fedora 发布版本构建中使用。

为了将ID嵌入剥离对象及其.debug文件,我选择使用ELF note节。
当类型为SHT_NOTE时,strip等工具可以保持该节在两个文件中的完整性。

新的节通常称为.note.gnu.build-id,但名称并非规范化,该节可以与其他SHT_NOTE节合并。
ELF note头部给出名字“GNU”和类型3(NT_GNU_BUILD_ID),用于构建ID note,链接对象(或类似.ko风格的ET_REL文件)中只能有一个此类节点。

您可以在2007年的此补丁中介绍中看到它:

此补丁为ELF目标添加了一个新选项--build-id,由ld生成一个包含“唯一构建ID”位的合成ELF注释部分。

这是作为ld选项完成的,以便对每个编译启用时高效且防错(而不是某些脚本将生成的对象添加到链接中)。
它是按照现有ELF位的确切最终输出量使用,既不多也不少,以有助于选择唯一ID。

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


赞赏这个典范的解释。这主要是由分发包构建者使用的。目前,我使用-X选项向Go应用程序添加标识符字符串。 - fabrizioM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接