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

deterministic mode in ranlib in gnu utilities

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

here

在您可以提供给 ranlib 的选项中有 -D-U

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

他们是这么说的:

-D

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

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

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

许多发行版都在努力将所有软件构建从源代码转换为二进制 "deterministic",这意味着在这种情况下,无论谁执行构建或他们何时执行构建,二进制文件都是您出去将 byte-for-byte 与其他任何人的构建相同。

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

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

POSIX 归档库格式(libfoo.a 文件的格式)基本上是目标文件的集合,加上 table 的内容。默认情况下,table 内容包含每个目标文件的时间戳、用户 ID 和组 ID。清楚地在 libfoo.a 文件中保留此信息使其 non-deterministic 因此不 byte-for-byte 相同。

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

请注意,如果您将 -D 选项与 ranlib 一起使用,您将破坏 make 的 library updating feature,它依赖于从库存档内部检查目标文件的时间戳。