编译链接期间生成build-id

问题描述

有人现在如何生成build-id吗?我一直在网上到处寻找,但找不到解释。我找到了https://fedoraproject.org/wiki/RolandMcGrath/BuildID,但这并不能告诉我它是如何产生的。我也https://elixir.bootlin.com/linux/v5.8.3/source/tools/perf/util/build-id.c也这样说,但是我不确定这是否是正确的地方。那么,有人知道build-id是如何生成的吗?

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

解决方法

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

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

正如Roland解释的那样,您可以可以为其使用随机UUID,但是这样做有一个缺点,那就是不能完全按位重建。您可以在整个ELF图像上也使用md5sha1校验和,但这可能会导致人们误将其用作实际校验和。

因此,该实现对图像的重要部分使用校验和,因此在不同图像上发生哈希冲突(相同的构建ID)的可能性很小。

确切重要的部分留给链接程序实现者,并留作实现细节。如果您想确切地了解这些部分是什么,则必须阅读GoldBFD ldLLD的相应实现文件。

您也可以替换您自己的 UUID(如果您不需要位相同的重建)– --build-id标志接受用户提供的位字符串,并乐意放入进入您的ELF图片。

P.S。您在perf中找到的build-id.c与 generation 的build-id无关。 perf 记录它观察到的图像的构建标识,因此以后的分析可以获取正确的ELF图像以执行符号化。