编译链接期间生成 build-id

build-id generation during compilation-linking

现在有人知道build-id是如何生成的吗?我一直在网上到处寻找,但找不到解释。我找到了这个,https://fedoraproject.org/wiki/RolandMcGrath/BuildID, but that doesn't tell me how it is generated. I also ound this, https://elixir.bootlin.com/linux/v5.8.3/source/tools/perf/util/build-id.c,但我不确定这个地方是否合适。那么,有人知道build-id是怎么生成的吗?

它是在 ELF 文件的一部分、多个部分还是随机生成的?

Is it generated over a section of an ELF file, multiple sections or randomly?

Build-ID 的目标是使其易于将调试信息与其所属的 ELF 映像(ET_EXECET_DYN)相关联。

正如 Roland 所解释的那样,您 可以 为它使用一个随机的 UUID,但这样做的缺点是会妨碍 bit-identical 重建。您 可以 也可以对整个 ELF 图像使用 md5sha1 校验和,但这存在人们将其误用作实际校验和的风险。

因此该实现对图像的 重要 部分使用校验和,因此不同图像上的哈希冲突(相同 build-ids)极不可能。

具体哪些部分是重要的留给链接器实现者,并留作实现细节。如果你想确切地知道这些部分是什么,你必须阅读Gold, BFD ld and LLD的相应实现文件。

你也可以替换你自己的 UUID(如果你不关心bit-identical重建)——--build-id标志接受user-provided 位串,我们会很乐意将它放入您的 ELF 图像中。

P.S。您在 perf 中找到的 build-id.c 与 build-ids 的 无关。 perf 记录 build-id张观察到的图片,方便后期分析抓取正确的ELF图片进行符号化。