gnu 实用程序中 ranlib 中的确定性模式
deterministic mode in ranlib in gnu utilities
我正在阅读有关 ranlib
更新索引或生成存档内容索引的文章
在您可以提供给 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,它依赖于从库存档内部检查目标文件的时间戳。
我正在阅读有关 ranlib
更新索引或生成存档内容索引的文章
在您可以提供给 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,它依赖于从库存档内部检查目标文件的时间戳。