lsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/kbuild/reproducible-buildsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/kbuild/reproducible-buildsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/kbuild/reproducible-buildsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/kbuild/reproducible-buildsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/kbuild/reproducible-buildsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/kbuild/reproducible-buildsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh[/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/kbuild/reproducible-builds.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h-Documentation/kbuild/reproducible-builds.rst h]h)}(h,Documentation/kbuild/reproducible-builds.rsth]h,Documentation/kbuild/reproducible-builds.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Translatorh]h Translator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h+慕冬亮 Dongliang Mu h]h)}(h*慕冬亮 Dongliang Mu h](h慕冬亮 Dongliang Mu <}(hj hhhNhNubh reference)}(hdzm91@hust.edu.cnh]hdzm91@hust.edu.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:dzm91@hust.edu.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h可重现的构建h]h可重现的构建}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjXhhhhhK ubh)}(hX%通常希望使用相同工具集构建相同源代码是可重现的,即,输出始终完全相同。这使得能够验证 二进制分发或嵌入式系统的构建基础设施未被篡改。这样也更容易验证源代码或工具的更改不会 影响最终生成的二进制文件。h]hX%通常希望使用相同工具集构建相同源代码是可重现的,即,输出始终完全相同。这使得能够验证 二进制分发或嵌入式系统的构建基础设施未被篡改。这样也更容易验证源代码或工具的更改不会 影响最终生成的二进制文件。}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjXhhubh)}(h`可重现构建项目`_ 提供了有关该主题的更多信息。本文档涵盖了构建内核可能不可重现的 各种原因,以及如何避免这些问题。h](j))}(h`可重现构建项目`_h]h可重现构建项目}(hj}hhhNhNubah}(h]h ]h"]h$]h&]name可重现构建项目refuri https://reproducible-builds.org/uh1j(hjyresolvedKubh 提供了有关该主题的更多信息。本文档涵盖了构建内核可能不可重现的 各种原因,以及如何避免这些问题。}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubjW)}(hhh](j\)}(h 时间戳h]h 时间戳}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubh)}(h'内核在三个地方嵌入时间戳:h]h'内核在三个地方嵌入时间戳:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh bullet_list)}(hhh](h list_item)}(hN通过 ``uname()`` 显示与包含在 ``/proc/version`` 中的版本字符串 h]h)}(hM通过 ``uname()`` 显示与包含在 ``/proc/version`` 中的版本字符串h](h通过 }(hjhhhNhNubhliteral)}(h ``uname()``h]huname()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 显示与包含在 }(hjhhhNhNubj)}(h``/proc/version``h]h /proc/version}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 中的版本字符串}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h initramfs 中的文件时间戳 h]h)}(hinitramfs 中的文件时间戳h]hinitramfs 中的文件时间戳}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h如果启动 ``CONFIG_IKHEADERS``,内核或相应模块中嵌入的内核头文件的时间戳, 通过 ``/sys/kernel/kheaders.tar.xz`` 显示 h]h)}(h如果启动 ``CONFIG_IKHEADERS``,内核或相应模块中嵌入的内核头文件的时间戳, 通过 ``/sys/kernel/kheaders.tar.xz`` 显示h](h 如果启动 }(hjhhhNhNubj)}(h``CONFIG_IKHEADERS``h]hCONFIG_IKHEADERS}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhJ,内核或相应模块中嵌入的内核头文件的时间戳, 通过 }(hjhhhNhNubj)}(h``/sys/kernel/kheaders.tar.xz``h]h/sys/kernel/kheaders.tar.xz}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 显示}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKhjhhubh)}(h默认情况下,时间戳为当前时间或内核头文件的修改时间。这个内容必须使用 `KBUILD_BUILD_TIMESTAMP`_ 变量进行覆盖。如果你从某个 git 提交进行构建, 可以使用其提交日期。h](hg默认情况下,时间戳为当前时间或内核头文件的修改时间。这个内容必须使用 }(hjZhhhNhNubj))}(h`KBUILD_BUILD_TIMESTAMP`_h]hKBUILD_BUILD_TIMESTAMP}(hjbhhhNhNubah}(h]h ]h"]h$]h&]nameKBUILD_BUILD_TIMESTAMPj"kbuild.html#kbuild-build-timestampuh1j(hjZjKubha 变量进行覆盖。如果你从某个 git 提交进行构建, 可以使用其提交日期。}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjhhubh)}(h内核 *不* 使用 ``__DATE__`` 和 ``__TIME__`` 宏,并在使用这些宏时启用警告。 如果你合并的外部代码使用这些宏,则必须通过设置 `SOURCE_DATE_EPOCH`_ 环境 变量来覆盖它们对应的时间戳。h](h内核 }(hj}hhhNhNubhemphasis)}(h*不*h]h不}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh 使用 }(hj}hhhNhNubj)}(h ``__DATE__``h]h__DATE__}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh 和 }(hj}hhhNhNubj)}(h ``__TIME__``h]h__TIME__}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubhu 宏,并在使用这些宏时启用警告。 如果你合并的外部代码使用这些宏,则必须通过设置 }(hj}hhhNhNubj))}(h`SOURCE_DATE_EPOCH`_h]hSOURCE_DATE_EPOCH}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameSOURCE_DATE_EPOCHj7https://reproducible-builds.org/docs/source-date-epoch/uh1j(hj}jKubh2 环境 变量来覆盖它们对应的时间戳。}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK$hjhhubeh}(h]id2ah ]h"] 时间戳ah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(h用户,主机h]h用户,主机}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhK)ubh)}(h内核在 ``/proc/version`` 中嵌入构建用户和主机名。必须使用 `KBUILD_BUILD_USER 和 KBUILD_BUILD_HOST`_ 变量来覆盖这些设置。如果 您从某个 git 提交进行构建,可以使用其提交者地址。h](h 内核在 }(hjhhhNhNubj)}(h``/proc/version``h]h /proc/version}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 中嵌入构建用户和主机名。必须使用 }(hjhhhNhNubj))}(h*`KBUILD_BUILD_USER 和 KBUILD_BUILD_HOST`_h]h'KBUILD_BUILD_USER 和 KBUILD_BUILD_HOST}(hj hhhNhNubah}(h]h ]h"]h$]h&]name'KBUILD_BUILD_USER 和 KBUILD_BUILD_HOSTj/kbuild.html#kbuild-build-user-kbuild-build-hostuh1j(hjjKubhm 变量来覆盖这些设置。如果 您从某个 git 提交进行构建,可以使用其提交者地址。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hjhhubeh}(h]id3ah ]h"]用户,主机ah$]h&]uh1jVhjXhhhhhK)ubjW)}(hhh](j\)}(h绝对文件名h]h绝对文件名}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hj.hhhhhK0ubh)}(h当内核在树外构建时,调试信息可能包括源文件的绝对文件名。这些信息必须通过在 `KCFLAGS`_ 变量中包含 ``-fdebug-prefix-map`` 选项来覆盖。h](hp当内核在树外构建时,调试信息可能包括源文件的绝对文件名。这些信息必须通过在 }(hj?hhhNhNubj))}(h `KCFLAGS`_h]hKCFLAGS}(hjGhhhNhNubah}(h]h ]h"]h$]h&]nameKCFLAGSjkbuild.html#kcflagsuh1j(hj?jKubh 变量中包含 }(hj?hhhNhNubj)}(h``-fdebug-prefix-map``h]h-fdebug-prefix-map}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh 选项来覆盖。}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK2hj.hhubh)}(h根据使用的编译器,``__FILE__`` 宏在树外构建中也可能扩展为绝对文件名。Kbuild 自动使用 ``-fmacro-prefix-map`` 选项来防止这种情况,前提是它被支持。h](h根据使用的编译器,}(hjthhhNhNubj)}(h ``__FILE__``h]h__FILE__}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubhN 宏在树外构建中也可能扩展为绝对文件名。Kbuild 自动使用 }(hjthhhNhNubj)}(h``-fmacro-prefix-map``h]h-fmacro-prefix-map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh7 选项来防止这种情况,前提是它被支持。}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK5hj.hhubh)}(hR可重现构建网站提供了有关这些 `prefix-map 选项`_ 的更多信息。h](h+可重现构建网站提供了有关这些 }(hjhhhNhNubj))}(h`prefix-map 选项`_h]hprefix-map 选项}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameprefix-map 选项j0https://reproducible-builds.org/docs/build-path/uh1j(hjjKubh 的更多信息。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK8hj.hhubeh}(h]id4ah ]h"]绝对文件名ah$]h&]uh1jVhjXhhhhhK0ubjW)}(hhh](j\)}(h在源包中的生成文件h]h在源包中的生成文件}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhK;ubh)}(hX5在 ``tools/`` 子目录下,一些程序的构建过程并不完全支持树外构建。这可能导致后续 使用如 ``make rpm-pkg`` 构建的源码包包含生成的文件。在构建源码包之前,您应该通过 运行 ``make mrproper`` 或 ``git clean -d -f -x`` 来确保源码树是干净的。h](h在 }(hjhhhNhNubj)}(h ``tools/``h]htools/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhl 子目录下,一些程序的构建过程并不完全支持树外构建。这可能导致后续 使用如 }(hjhhhNhNubj)}(h``make rpm-pkg``h]h make rpm-pkg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh] 构建的源码包包含生成的文件。在构建源码包之前,您应该通过 运行 }(hjhhhNhNubj)}(h``make mrproper``h]h make mrproper}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 或 }(hjhhhNhNubj)}(h``git clean -d -f -x``h]hgit clean -d -f -x}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" 来确保源码树是干净的。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubeh}(h]id5ah ]h"]在源包中的生成文件ah$]h&]uh1jVhjXhhhhhK;ubjW)}(hhh](j\)}(h 模块签名h]h 模块签名}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j[hj@hhhhhKBubh)}(h如果你启用 ``CONFIG_MODULE_SIG_ALL``,默认行为是为每次构建生成不同的临时密钥, 从而导致模块不可重现。然而,将签名密钥包含在源代码中显然会违背签名模块的目的。h](h如果你启用 }(hjQhhhNhNubj)}(h``CONFIG_MODULE_SIG_ALL``h]hCONFIG_MODULE_SIG_ALL}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubh,默认行为是为每次构建生成不同的临时密钥, 从而导致模块不可重现。然而,将签名密钥包含在源代码中显然会违背签名模块的目的。}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKDhj@hhubh)}(hf一种方法是将构建过程分为几个部分,以便不可重现的部分可以作为源处理:h]hf一种方法是将构建过程分为几个部分,以便不可重现的部分可以作为源处理:}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhj@hhubhenumerated_list)}(hhh]j)}(hX生成一个持久的签名密钥。将该密钥的证书添加到内核源代码中。 h]h)}(hW生成一个持久的签名密钥。将该密钥的证书添加到内核源代码中。h]hW生成一个持久的签名密钥。将该密钥的证书添加到内核源代码中。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhj@hhhhhKIubh)}(h2. 将 ``CONFIG_SYSTEM_TRUSTED_KEYS`` 符号设置为包括签名密钥的证书,将 ``CONFIG_MODULE_SIG_KEY`` 设置为空字符串,并禁用 ``CONFIG_MODULE_SIG_ALL``。 最后,构建内核和模块。h](h2. 将 }(hjhhhNhNubj)}(h``CONFIG_SYSTEM_TRUSTED_KEYS``h]hCONFIG_SYSTEM_TRUSTED_KEYS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 符号设置为包括签名密钥的证书,将 }(hjhhhNhNubj)}(h``CONFIG_MODULE_SIG_KEY``h]hCONFIG_MODULE_SIG_KEY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# 设置为空字符串,并禁用 }(hjhhhNhNubj)}(h``CONFIG_MODULE_SIG_ALL``h]hCONFIG_MODULE_SIG_ALL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh%。 最后,构建内核和模块。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKKhj@hhubj)}(hhh](j)}(h@为模块创建分离的签名,并将它们作为源发布。 h]h)}(h?为模块创建分离的签名,并将它们作为源发布。h]h?为模块创建分离的签名,并将它们作为源发布。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hd附加模块签名并进行第二次构建。这可以重建模块,或使用步骤 2 的输出。 h]h)}(hc附加模块签名并进行第二次构建。这可以重建模块,或使用步骤 2 的输出。h]hc附加模块签名并进行第二次构建。这可以重建模块,或使用步骤 2 的输出。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]jjjhjjstartKuh1jhj@hhhhhKOubeh}(h]id6ah ]h"] 模块签名ah$]h&]uh1jVhjXhhhhhKBubjW)}(hhh](j\)}(h结构随机化h]h结构随机化}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hj-hhhhhKTubh)}(h如果你启用 ``CONFIG_RANDSTRUCT``,则需要在 ``scripts/basic/randstruct.seed`` 中预生成随机种子,以便每次构建都使用相同的值。有关详细信息,请参见 ``scripts/gen-randstruct-seed.sh``。h](h如果你启用 }(hj>hhhNhNubj)}(h``CONFIG_RANDSTRUCT``h]hCONFIG_RANDSTRUCT}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh,则需要在 }(hj>hhhNhNubj)}(h!``scripts/basic/randstruct.seed``h]hscripts/basic/randstruct.seed}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubhe 中预生成随机种子,以便每次构建都使用相同的值。有关详细信息,请参见 }(hj>hhhNhNubj)}(h"``scripts/gen-randstruct-seed.sh``h]hscripts/gen-randstruct-seed.sh}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh。}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKVhj-hhubeh}(h]id7ah ]h"]结构随机化ah$]h&]uh1jVhjXhhhhhKTubjW)}(hhh](j\)}(h调试信息冲突h]h调试信息冲突}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhK[ubh)}(h^这并非是个不可重现性的问题,而是生成的文件 *过于* 可重现的问题。h](h@这并非是个不可重现性的问题,而是生成的文件 }(hjhhhNhNubj)}(h*过于*h]h过于}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 可重现的问题。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK]hjhhubh)}(h一旦你设置了所有必要的变量来开展可重现构建,vDSO 的调试信息可能即使对于不同的内核版 本也是相同的。这会导致不同内核版本的调试信息软件包之间发生文件冲突。h]h一旦你设置了所有必要的变量来开展可重现构建,vDSO 的调试信息可能即使对于不同的内核版 本也是相同的。这会导致不同内核版本的调试信息软件包之间发生文件冲突。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hjhhubh)}(h为了避免这种情况,你可以通过在 vDSO 中包含一个任意的 salt 字符串,使其对于不同的 内核版本是不同的。这种机制由 Kconfig 符号 ``CONFIG_BUILD_SALT`` 指定。h](h为了避免这种情况,你可以通过在 vDSO 中包含一个任意的 salt 字符串,使其对于不同的 内核版本是不同的。这种机制由 Kconfig 符号 }(hjhhhNhNubj)}(h``CONFIG_BUILD_SALT``h]hCONFIG_BUILD_SALT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 指定。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKbhjhhubeh}(h]id8ah ]h"]调试信息冲突ah$]h&]uh1jVhjXhhhhhK[ubjW)}(hhh](j\)}(hGith]hGit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKfubh)}(hXT未提交的更改或 Git 中的不同提交 ID 也可能导致不同的编译结果。例如,在执行 ``git reset HEAD^`` 后,即使代码相同,编译期间生成的 ``include/config/kernel.release`` 也会不同,导致最终生成的二进制文件也不尽相同。 有关详细信息,请参见 ``scripts/setlocalversion``。h](hj未提交的更改或 Git 中的不同提交 ID 也可能导致不同的编译结果。例如,在执行 }(hjhhhNhNubj)}(h``git reset HEAD^``h]hgit reset HEAD^}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 后,即使代码相同,编译期间生成的 }(hjhhhNhNubj)}(h!``include/config/kernel.release``h]hinclude/config/kernel.release}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf 也会不同,导致最终生成的二进制文件也不尽相同。 有关详细信息,请参见 }(hjhhhNhNubj)}(h``scripts/setlocalversion``h]hscripts/setlocalversion}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhjhhubhtarget)}(h>.. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamph]h}(h]kbuild-build-timestampah ]h"]kbuild_build_timestampah$]h&]jjruh1jFhKxhjhhhh referencedKubjG)}(h\.. _KBUILD_BUILD_USER 和 KBUILD_BUILD_HOST: kbuild.html#kbuild-build-user-kbuild-build-hosth]h}(h]#kbuild-build-user-kbuild-build-hostah ]h"]'kbuild_build_user 和 kbuild_build_hostah$]h&]jjuh1jFhKyhjhhhhjTKubjG)}(h .. _KCFLAGS: kbuild.html#kcflagsh]h}(h]kcflagsah ]h"]kcflagsah$]h&]jjWuh1jFhKzhjhhhhjTKubjG)}(hG.. _prefix-map 选项: https://reproducible-builds.org/docs/build-path/h]h}(h] prefix-mapah ]h"]prefix-map 选项ah$]h&]jjuh1jFhK{hjhhhhjTKubjG)}(h;.. _可重现构建项目: https://reproducible-builds.org/h]h}(h]id9ah ]h"]可重现构建项目ah$]h&]jjuh1jFhK|hjhhhhjTKubjG)}(hN.. _SOURCE_DATE_EPOCH: https://reproducible-builds.org/docs/source-date-epoch/h]h}(h]source-date-epochah ]h"]source_date_epochah$]h&]jjuh1jFhK}hjhhhhjTKubeh}(h]gitah ]h"]gitah$]h&]uh1jVhjXhhhhhKfubeh}(h]id1ah ]h"]可重现的构建ah$]h&]uh1jVhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j[N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}(可重现构建项目]j}akbuild_build_timestamp]jbasource_date_epoch]ja'kbuild_build_user 和 kbuild_build_host]j akcflags]jGaprefix-map 选项]jaurefids}nameids}(jjjjj+j(jjj=j:j*j'jjjjjjjQjNj^j[jjjgjvjsjjjju nametypes}(jjj+jj=j*jjjjQj^jjjvjjuh}(jjXjjj(jjj.j:jj'j@jj-jjjjjNjHj[jUjgjajsjmjjyjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jK sRparse_messages]hsystem_message)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "3" (ordinal 3)h]h>Enumerated list start value not ordinal-1: “3” (ordinal 3)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineK uh1j2hj@hhhhhKOubatransform_messages] transformerN include_log]?Documentation/translations/zh_CN/kbuild/reproducible-builds.rst(NNNNta decorationNhhub.