gnu 实用程序中 ranlib 中的确定性模式

zix*_*ool 2 unix gnu makefile archive unix-ar

我正在阅读有关ranlib更新索引或生成存档内容索引的内容

\n\n

这里

\n\n

在您可以提供的选项中ranlib-D\nand-U

\n\n

我阅读了定义,但我无法理解它:

\n\n

他们是这么说的:

\n\n
-D\n
Run Code Online (Sandbox Code Playgroud)\n\n

在确定性模式下运行。符号映射存档成员\xe2\x80\x99s 标头的 UID、GID 和时间戳将显示为零。使用此选项时,多次运行将生成相同的输出文件。\n如果 binutils 配置了 --enable-deterministic-archives,

\n\n

任何人都可以提供这两个选项的简单解释ranlib\n(-D 和-U)

\n\n

为什么有人需要使用这个选项?

\n

Mad*_*ist 6

许多发行版正在努力使从源代码到二进制文件的所有软件构建都是“确定性的”,这意味着在这种情况下,无论谁执行构建或何时执行构建,您得到的二进制文件都将是字节的-byte 与其他人的构建相同。

目标是允许通过校验和验证二进制文件、验证签名等。

不用说,这是跨许多工具的大量工作,并且假设您使用预定义版本的编译器、运行时库等。

POSIX 归档库格式(libfoo.a文件格式)基本上是目标文件的集合以及目录。默认情况下,目录包含每个对象文件的时间戳、用户 ID 和组 ID。显然,在libfoo.a文件中保留此信息会使其具有不确定性,因此逐字节不完全相同。

因此,对于关心确定性构建的人来说,他们应该使用-D将 0 写入这些字段而不是实际值的选项。对于不关心确定性构建的人,他们应该使用-U使用真实值的选项。

请注意,如果您使用该-D选项,ranlib您将破坏 make 的库更新功能,该功能依赖于从库存档内部检查目标文件的时间戳。