我正在阅读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生成风格(即密码哈希)总是能够为重复精确复制的结果产生相同结果的最佳方式。