^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]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/pt_BR/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)}(hjh]h$Documentation/kbuild/gcc-plugins.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(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&]uh1hhjhhhKubj)}(h+慕冬亮 Dongliang Mu h]h)}(h*慕冬亮 Dongliang Mu h](h慕冬亮 Dongliang Mu <}(hj3hhhNhNubh reference)}(hdzm91@hust.edu.cnh]hdzm91@hust.edu.cn}(hj=hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:dzm91@hust.edu.cnuh1j;hj3ubh>}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj/ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(hGCC 插件基础设施h]hGCC 插件基础设施}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjkhhhhhK ubjj)}(hhh](jo)}(h介绍h]h介绍}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhj~hhhhhKubh)}(hXGCC 插件是为编译器提供额外功能的可加载模块 [1]_。它们对于运行时插装和静态分析非常有用。 我们可以在编译过程中通过回调 [2]_,GIMPLE [3]_,IPA [4]_ 和 RTL Passes [5]_ (译者注:Pass 是编译器所采用的一种结构化技术,用于完成编译对象的分析、优化或转换等功能) 来分析、修改和添加更多的代码。h](h>GCC 插件是为编译器提供额外功能的可加载模块 }(hjhhhNhNubhfootnote_reference)}(h[1]_h]h1}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refidid9docname%translations/zh_CN/kbuild/gcc-pluginsuh1jhjresolvedKubhh。它们对于运行时插装和静态分析非常有用。 我们可以在编译过程中通过回调 }(hjhhhNhNubj)}(h[2]_h]h2}(hjhhhNhNubah}(h]id3ah ]h"]h$]h&]jid10jjuh1jhjjKubh ,GIMPLE }(hjhhhNhNubj)}(h[3]_h]h3}(hjhhhNhNubah}(h]id4ah ]h"]h$]h&]jid11jjuh1jhjjKubh,IPA }(hjhhhNhNubj)}(h[4]_h]h4}(hjhhhNhNubah}(h]id5ah ]h"]h$]h&]jid12jjuh1jhjjKubh 和 RTL Passes }(hjhhhNhNubj)}(h[5]_h]h5}(hjhhhNhNubah}(h]id6ah ]h"]h$]h&]jid13jjuh1jhjjKubh (译者注:Pass 是编译器所采用的一种结构化技术,用于完成编译对象的分析、优化或转换等功能) 来分析、修改和添加更多的代码。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj~hhubh)}(h内核的 GCC 插件基础设施支持构建树外模块、交叉编译和在单独的目录中构建。插件源文件必须由 C++ 编译器编译。h]h内核的 GCC 插件基础设施支持构建树外模块、交叉编译和在单独的目录中构建。插件源文件必须由 C++ 编译器编译。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj~hhubh)}(h|目前 GCC 插件基础设施只支持一些架构。搜索 "select HAVE_GCC_PLUGINS" 来查找支持 GCC 插件的架构。h]h目前 GCC 插件基础设施只支持一些架构。搜索 “select HAVE_GCC_PLUGINS” 来查找支持 GCC 插件的架构。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj~hhubh)}(hI这个基础设施是从 grsecurity [6]_ 和 PaX [7]_ 移植过来的。h](h$这个基础设施是从 grsecurity }(hj#hhhNhNubj)}(h[6]_h]h6}(hj+hhhNhNubah}(h]id7ah ]h"]h$]h&]jid14jjuh1jhj#jKubh 和 PaX }(hj#hhhNhNubj)}(h[7]_h]h7}(hj?hhhNhNubah}(h]id8ah ]h"]h$]h&]jid15jjuh1jhj#jKubh 移植过来的。}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj~hhubh)}(h--h]h--}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj~hhubhfootnote)}(h2https://gcc.gnu.org/onlinedocs/gccint/Plugins.htmlh](hlabel)}(h1h]h1}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jmhjiubh)}(hjkh]j<)}(hjkh]h2https://gcc.gnu.org/onlinedocs/gccint/Plugins.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijkuh1j;hj}ubah}(h]h ]h"]h$]h&]uh1hhhhKhjiubeh}(h]jah ]h"]1ah$]h&]jajjuh1jghhhKhj~hhjKubjh)}(h@https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-APIh](jn)}(h2h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhjubh)}(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&]jajjuh1jghhhK hj~hhjKubjh)}(h1https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.htmlh](jn)}(h3h]h3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhjubh)}(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&]jajjuh1jghhhK!hj~hhjKubjh)}(h.https://gcc.gnu.org/onlinedocs/gccint/IPA.htmlh](jn)}(h4h]h4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhjubh)}(hjh]j<)}(hjh]h.https://gcc.gnu.org/onlinedocs/gccint/IPA.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j;hj ubah}(h]h ]h"]h$]h&]uh1hhhhK"hjubeh}(h]jah ]h"]4ah$]h&]jajjuh1jghhhK"hj~hhjKubjh)}(h.https://gcc.gnu.org/onlinedocs/gccint/RTL.htmlh](jn)}(h5h]h5}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhj+ubh)}(hj-h]j<)}(hj-h]h.https://gcc.gnu.org/onlinedocs/gccint/RTL.html}(hj@hhhNhNubah}(h]h ]h"]h$]h&]refurij-uh1j;hj=ubah}(h]h ]h"]h$]h&]uh1hhhhK#hj+ubeh}(h]jah ]h"]5ah$]h&]jajjuh1jghhhK#hj~hhjKubjh)}(hhttps://grsecurity.net/h](jn)}(h6h]h6}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhj[ubh)}(hj]h]j<)}(hj]h]hhttps://grsecurity.net/}(hjphhhNhNubah}(h]h ]h"]h$]h&]refurij]uh1j;hjmubah}(h]h ]h"]h$]h&]uh1hhhhK$hj[ubeh}(h]j:ah ]h"]6ah$]h&]j5ajjuh1jghhhK$hj~hhjKubjh)}(hhttps://pax.grsecurity.net/ h](jn)}(h7h]h7}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhjubh)}(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%hjubeh}(h]jNah ]h"]7ah$]h&]jIajjuh1jghhhK%hj~hhjKubeh}(h]id1ah ]h"]介绍ah$]h&]uh1jihjkhhhhhKubjj)}(hhh](jo)}(h目的h]h目的}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjhhhhhK)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不}(hj hhhNhNubah}(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&]uh1jihjkhhhhhK)ubjj)}(hhh](jo)}(h文件h]h文件}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jnhj7hhhhhKhj7hhubh block_quote)}(h这是 GCC 插件的目录。 h]h)}(h这是 GCC 插件的目录。h]h这是 GCC 插件的目录。}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjaubah}(h]h ]h"]h$]h&]uh1j_hhhK@hj7hhubh)}(h+**$(src)/scripts/gcc-plugins/gcc-common.h**h]j)}(hj{h]h'$(src)/scripts/gcc-plugins/gcc-common.h}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hhhhKBhj7hhubj`)}(hc这是 GCC 插件的兼容性头文件。 应始终包含它,而不是单独的 GCC 头文件。 h]h)}(hb这是 GCC 插件的兼容性头文件。 应始终包含它,而不是单独的 GCC 头文件。h]hb这是 GCC 插件的兼容性头文件。 应始终包含它,而不是单独的 GCC 头文件。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjubah}(h]h ]h"]h$]h&]uh1j_hhhKDhj7hhubh)}(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&]uh1hhhhKGhj7hhubj`)}(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&]uh1j_hhhKLhj7hhubeh}(h]id17ah ]h"]文件ah$]h&]uh1jihjkhhhhhK