]sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/kbuild/gcc-pluginsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/kbuild/gcc-pluginsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/kbuild/gcc-pluginsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/kbuild/gcc-pluginsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/kbuild/gcc-pluginsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/kbuild/gcc-pluginsmodnameN 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:spacepreserveuh1hhhhhhS/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/kbuild/gcc-plugins.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/gcc-plugins.rsth]h)}(hhh]h$Documentation/kbuild/gcc-plugins.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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h+慕冬亮 Dongliang Mu h]h)}(h*慕冬亮 Dongliang Mu h](h慕冬亮 Dongliang Mu <}(hjhhhNhNubh reference)}(hdzm91@hust.edu.cnh]hdzm91@hust.edu.cn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:dzm91@hust.edu.cnuh1j'hjubh>}(hjhhhNhNubeh}(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)}(hGCC 插件基础设施h]hGCC 插件基础设施}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjWhhhhhK ubjV)}(hhh](j[)}(h介绍h]h介绍}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjjhhhhhKubh)}(hXGCC 插件是为编译器提供额外功能的可加载模块 [1]_。它们对于运行时插装和静态分析非常有用。 我们可以在编译过程中通过回调 [2]_,GIMPLE [3]_,IPA [4]_ 和 RTL Passes [5]_ (译者注:Pass 是编译器所采用的一种结构化技术,用于完成编译对象的分析、优化或转换等功能) 来分析、修改和添加更多的代码。h](h>GCC 插件是为编译器提供额外功能的可加载模块 }(hj{hhhNhNubhfootnote_reference)}(h[1]_h]h1}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refidid9docname%translations/zh_CN/kbuild/gcc-pluginsuh1jhj{resolvedKubhh。它们对于运行时插装和静态分析非常有用。 我们可以在编译过程中通过回调 }(hj{hhhNhNubj)}(h[2]_h]h2}(hjhhhNhNubah}(h]id3ah ]h"]h$]h&]jid10jjuh1jhj{jKubh ,GIMPLE }(hj{hhhNhNubj)}(h[3]_h]h3}(hjhhhNhNubah}(h]id4ah ]h"]h$]h&]jid11jjuh1jhj{jKubh,IPA }(hj{hhhNhNubj)}(h[4]_h]h4}(hjhhhNhNubah}(h]id5ah ]h"]h$]h&]jid12jjuh1jhj{jKubh 和 RTL Passes }(hj{hhhNhNubj)}(h[5]_h]h5}(hjhhhNhNubah}(h]id6ah ]h"]h$]h&]jid13jjuh1jhj{jKubh (译者注:Pass 是编译器所采用的一种结构化技术,用于完成编译对象的分析、优化或转换等功能) 来分析、修改和添加更多的代码。}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjjhhubh)}(h内核的 GCC 插件基础设施支持构建树外模块、交叉编译和在单独的目录中构建。插件源文件必须由 C++ 编译器编译。h]h内核的 GCC 插件基础设施支持构建树外模块、交叉编译和在单独的目录中构建。插件源文件必须由 C++ 编译器编译。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjjhhubh)}(h|目前 GCC 插件基础设施只支持一些架构。搜索 "select HAVE_GCC_PLUGINS" 来查找支持 GCC 插件的架构。h]h目前 GCC 插件基础设施只支持一些架构。搜索 “select HAVE_GCC_PLUGINS” 来查找支持 GCC 插件的架构。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjjhhubh)}(hI这个基础设施是从 grsecurity [6]_ 和 PaX [7]_ 移植过来的。h](h$这个基础设施是从 grsecurity }(hjhhhNhNubj)}(h[6]_h]h6}(hjhhhNhNubah}(h]id7ah ]h"]h$]h&]jid14jjuh1jhjjKubh 和 PaX }(hjhhhNhNubj)}(h[7]_h]h7}(hj+hhhNhNubah}(h]id8ah ]h"]h$]h&]jid15jjuh1jhjjKubh 移植过来的。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjjhhubh)}(h--h]h--}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjjhhubhfootnote)}(h2https://gcc.gnu.org/onlinedocs/gccint/Plugins.htmlh](hlabel)}(h1h]h1}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjUubh)}(hjWh]j()}(hjWh]h2https://gcc.gnu.org/onlinedocs/gccint/Plugins.html}(hjlhhhNhNubah}(h]h ]h"]h$]h&]refurijWuh1j'hjiubah}(h]h ]h"]h$]h&]uh1hhhhKhjUubeh}(h]jah ]h"]1ah$]h&]jajjuh1jShhhKhjjhhjKubjT)}(h@https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-APIh](jZ)}(h2h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh)}(hjh]j()}(hjh]h@https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-API}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j'hjubah}(h]h ]h"]h$]h&]uh1hhhhK hjubeh}(h]jah ]h"]2ah$]h&]jajjuh1jShhhK hjjhhjKubjT)}(h1https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.htmlh](jZ)}(h3h]h3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh)}(hjh]j()}(hjh]h1https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j'hjubah}(h]h ]h"]h$]h&]uh1hhhhK!hjubeh}(h]jah ]h"]3ah$]h&]jajjuh1jShhhK!hjjhhjKubjT)}(h.https://gcc.gnu.org/onlinedocs/gccint/IPA.htmlh](jZ)}(h4h]h4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh)}(hjh]j()}(hjh]h.https://gcc.gnu.org/onlinedocs/gccint/IPA.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j'hjubah}(h]h ]h"]h$]h&]uh1hhhhK"hjubeh}(h]jah ]h"]4ah$]h&]jajjuh1jShhhK"hjjhhjKubjT)}(h.https://gcc.gnu.org/onlinedocs/gccint/RTL.htmlh](jZ)}(h5h]h5}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh)}(hjh]j()}(hjh]h.https://gcc.gnu.org/onlinedocs/gccint/RTL.html}(hj,hhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j'hj)ubah}(h]h ]h"]h$]h&]uh1hhhhK#hjubeh}(h]jah ]h"]5ah$]h&]jajjuh1jShhhK#hjjhhjKubjT)}(hhttps://grsecurity.net/h](jZ)}(h6h]h6}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjGubh)}(hjIh]j()}(hjIh]hhttps://grsecurity.net/}(hj\hhhNhNubah}(h]h ]h"]h$]h&]refurijIuh1j'hjYubah}(h]h ]h"]h$]h&]uh1hhhhK$hjGubeh}(h]j&ah ]h"]6ah$]h&]j!ajjuh1jShhhK$hjjhhjKubjT)}(hhttps://pax.grsecurity.net/ h](jZ)}(h7h]h7}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjwubh)}(hhttps://pax.grsecurity.net/h]j()}(hjh]hhttps://pax.grsecurity.net/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j'hjubah}(h]h ]h"]h$]h&]uh1hhhhK%hjwubeh}(h]j:ah ]h"]7ah$]h&]j5ajjuh1jShhhK%hjjhhjKubeh}(h]id1ah ]h"]介绍ah$]h&]uh1jUhjWhhhhhKubjV)}(hhh](j[)}(h目的h]h目的}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjhhhhhK)ubh)}(hX8GCC 插件的设计目的是提供一个用于试验 GCC 或 Clang 上游没有的潜在编译器功能的场所。 一旦它们的实用性得到验证,这些功能将被添加到 GCC(和 Clang)的上游。随后,在所有 支持的 GCC 版本都支持这些功能后,它们会被从内核中移除。h]hX8GCC 插件的设计目的是提供一个用于试验 GCC 或 Clang 上游没有的潜在编译器功能的场所。 一旦它们的实用性得到验证,这些功能将被添加到 GCC(和 Clang)的上游。随后,在所有 支持的 GCC 版本都支持这些功能后,它们会被从内核中移除。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjhhubh)}(h^具体来说,新插件应该只实现上游编译器(GCC 和 Clang)不支持的功能。h]h^具体来说,新插件应该只实现上游编译器(GCC 和 Clang)不支持的功能。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjhhubh)}(h当 Clang 中存在 GCC 中不存在的某项功能时,应努力将该功能做到 GCC 上游(而不仅仅 是作为内核专用的 GCC 插件),以使整个生态都能从中受益。h]h当 Clang 中存在 GCC 中不存在的某项功能时,应努力将该功能做到 GCC 上游(而不仅仅 是作为内核专用的 GCC 插件),以使整个生态都能从中受益。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjhhubh)}(h类似的,如果 GCC 插件提供的功能在 Clang 中 **不** 存在,但该功能被证明是有用的,也应 努力将该功能上传到 GCC(和 Clang)。h](h:类似的,如果 GCC 插件提供的功能在 Clang 中 }(hjhhhNhNubhstrong)}(h**不**h]h不}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf 存在,但该功能被证明是有用的,也应 努力将该功能上传到 GCC(和 Clang)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK4hjhhubh)}(h在上游 GCC 提供了某项功能后,该插件将无法在相应的 GCC 版本(以及更高版本)下编译。 一旦所有内核支持的 GCC 版本都提供了该功能,该插件将从内核中移除。h]h在上游 GCC 提供了某项功能后,该插件将无法在相应的 GCC 版本(以及更高版本)下编译。 一旦所有内核支持的 GCC 版本都提供了该功能,该插件将从内核中移除。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjhhubeh}(h]id16ah ]h"]目的ah$]h&]uh1jUhjWhhhhhK)ubjV)}(hhh](j[)}(h文件h]h文件}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jZhj#hhhhhKhj#hhubh block_quote)}(h这是 GCC 插件的目录。 h]h)}(h这是 GCC 插件的目录。h]h这是 GCC 插件的目录。}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjMubah}(h]h ]h"]h$]h&]uh1jKhhhK@hj#hhubh)}(h+**$(src)/scripts/gcc-plugins/gcc-common.h**h]j)}(hjgh]h'$(src)/scripts/gcc-plugins/gcc-common.h}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhhhKBhj#hhubjL)}(hc这是 GCC 插件的兼容性头文件。 应始终包含它,而不是单独的 GCC 头文件。 h]h)}(hb这是 GCC 插件的兼容性头文件。 应始终包含它,而不是单独的 GCC 头文件。h]hb这是 GCC 插件的兼容性头文件。 应始终包含它,而不是单独的 GCC 头文件。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhj|ubah}(h]h ]h"]h$]h&]uh1jKhhhKDhj#hhubh)}(h**$(src)/scripts/gcc-plugins/gcc-generate-gimple-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-rtl-pass.h**h]j)}(hjh]h$(src)/scripts/gcc-plugins/gcc-generate-gimple-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-rtl-pass.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhKGhj#hhubjL)}(h这些头文件可以自动生成 GIMPLE、SIMPLE_IPA、IPA 和 RTL passes 的注册结构。 与手动创建结构相比,它们更受欢迎。 h]h)}(h这些头文件可以自动生成 GIMPLE、SIMPLE_IPA、IPA 和 RTL passes 的注册结构。 与手动创建结构相比,它们更受欢迎。h]h这些头文件可以自动生成 GIMPLE、SIMPLE_IPA、IPA 和 RTL passes 的注册结构。 与手动创建结构相比,它们更受欢迎。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubah}(h]h ]h"]h$]h&]uh1jKhhhKLhj#hhubeh}(h]id17ah ]h"]文件ah$]h&]uh1jUhjWhhhhhK