ksphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget7/translations/zh_CN/bpf/libbpf/libbpf_naming_conventionmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/zh_TW/bpf/libbpf/libbpf_naming_conventionmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/it_IT/bpf/libbpf/libbpf_naming_conventionmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/ja_JP/bpf/libbpf/libbpf_naming_conventionmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/ko_KR/bpf/libbpf/libbpf_naming_conventionmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/sp_SP/bpf/libbpf/libbpf_naming_conventionmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h3SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)h]h3SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhQ/var/lib/git/docbuild/linux/Documentation/bpf/libbpf/libbpf_naming_convention.rsthKubhsection)}(hhh](htitle)}(hAPI naming conventionh]hAPI naming convention}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXlibbpf API provides access to a few logically separated groups of functions and types. Every group has its own naming convention described here. It's recommended to follow these conventions whenever a new function or type is added to keep libbpf API clean and consistent.h]hXlibbpf API provides access to a few logically separated groups of functions and types. Every group has its own naming convention described here. It’s recommended to follow these conventions whenever a new function or type is added to keep libbpf API clean and consistent.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hAll types and functions provided by libbpf API should have one of the following prefixes: ``bpf_``, ``btf_``, ``libbpf_``, ``btf_dump_``, ``ring_buffer_``, ``perf_buffer_``.h](hZAll types and functions provided by libbpf API should have one of the following prefixes: }(hhhhhNhNubhliteral)}(h``bpf_``h]hbpf_}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh, }(hhhhhNhNubh)}(h``btf_``h]hbtf_}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh, }hhsbh)}(h ``libbpf_``h]hlibbpf_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh, }hhsbh)}(h ``btf_dump_``h]h btf_dump_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh, }(hhhhhNhNubh)}(h``ring_buffer_``h]h ring_buffer_}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh, }hhsbh)}(h``perf_buffer_``h]h perf_buffer_}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(hSystem call wrappersh]hSystem call wrappers}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhhhhhKubh)}(hSystem call wrappers are simple wrappers for commands supported by sys_bpf system call. These wrappers should go to ``bpf.h`` header file and map one to one to corresponding commands.h](htSystem call wrappers are simple wrappers for commands supported by sys_bpf system call. These wrappers should go to }(hjfhhhNhNubh)}(h ``bpf.h``h]hbpf.h}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfubh: header file and map one to one to corresponding commands.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjUhhubh)}(hFor example ``bpf_map_lookup_elem`` wraps ``BPF_MAP_LOOKUP_ELEM`` command of sys_bpf, ``bpf_prog_attach`` wraps ``BPF_PROG_ATTACH``, etc.h](h For example }(hjhhhNhNubh)}(h``bpf_map_lookup_elem``h]hbpf_map_lookup_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh wraps }(hjhhhNhNubh)}(h``BPF_MAP_LOOKUP_ELEM``h]hBPF_MAP_LOOKUP_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh command of sys_bpf, }(hjhhhNhNubh)}(h``bpf_prog_attach``h]hbpf_prog_attach}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh wraps }hjsbh)}(h``BPF_PROG_ATTACH``h]hBPF_PROG_ATTACH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, etc.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjUhhubeh}(h]system-call-wrappersah ]h"]system call wrappersah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hObjectsh]hObjects}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX-Another class of types and functions provided by libbpf API is "objects" and functions to work with them. Objects are high-level abstractions such as BPF program or BPF map. They're represented by corresponding structures such as ``struct bpf_object``, ``struct bpf_program``, ``struct bpf_map``, etc.h](hAnother class of types and functions provided by libbpf API is “objects” and functions to work with them. Objects are high-level abstractions such as BPF program or BPF map. They’re represented by corresponding structures such as }(hjhhhNhNubh)}(h``struct bpf_object``h]hstruct bpf_object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, }(hjhhhNhNubh)}(h``struct bpf_program``h]hstruct bpf_program}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, }(hjhhhNhNubh)}(h``struct bpf_map``h]hstruct bpf_map}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, etc.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hStructures are forward declared and access to their fields should be provided via corresponding getters and setters rather than directly.h]hStructures are forward declared and access to their fields should be provided via corresponding getters and setters rather than directly.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjhhubh)}(hhThese objects are associated with corresponding parts of ELF object that contains compiled BPF programs.h]hhThese objects are associated with corresponding parts of ELF object that contains compiled BPF programs.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjhhubh)}(hFor example ``struct bpf_object`` represents ELF object itself created from an ELF file or from a buffer, ``struct bpf_program`` represents a program in ELF object and ``struct bpf_map`` is a map.h](h For example }(hjUhhhNhNubh)}(h``struct bpf_object``h]hstruct bpf_object}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUubhI represents ELF object itself created from an ELF file or from a buffer, }(hjUhhhNhNubh)}(h``struct bpf_program``h]hstruct bpf_program}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUubh( represents a program in ELF object and }(hjUhhhNhNubh)}(h``struct bpf_map``h]hstruct bpf_map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUubh is a map.}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK(hjhhubh)}(hFunctions that work with an object have names built from object name, double underscore and part that describes function purpose.h]hFunctions that work with an object have names built from object name, double underscore and part that describes function purpose.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjhhubh)}(hFor example ``bpf_object__open`` consists of the name of corresponding object, ``bpf_object``, double underscore and ``open`` that defines the purpose of the function to open ELF file and create ``bpf_object`` from it.h](h For example }(hjhhhNhNubh)}(h``bpf_object__open``h]hbpf_object__open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh/ consists of the name of corresponding object, }(hjhhhNhNubh)}(h``bpf_object``h]h bpf_object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, double underscore and }(hjhhhNhNubh)}(h``open``h]hopen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhF that defines the purpose of the function to open ELF file and create }(hjhhhNhNubh)}(h``bpf_object``h]h bpf_object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh from it.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK/hjhhubh)}(hAll objects and corresponding functions other than BTF related should go to ``libbpf.h``. BTF types and functions should go to ``btf.h``.h](hLAll objects and corresponding functions other than BTF related should go to }(hjhhhNhNubh)}(h ``libbpf.h``h]hlibbpf.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh'. BTF types and functions should go to }(hjhhhNhNubh)}(h ``btf.h``h]hbtf.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK4hjhhubeh}(h]objectsah ]h"]objectsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hAuxiliary functionsh]hAuxiliary functions}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hhhhhK8ubh)}(hAuxiliary functions and types that don't fit well in any of categories described above should have ``libbpf_`` prefix, e.g. ``libbpf_get_error`` or ``libbpf_prog_type_by_name``.h](heAuxiliary functions and types that don’t fit well in any of categories described above should have }(hjHhhhNhNubh)}(h ``libbpf_``h]hlibbpf_}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHubh prefix, e.g. }(hjHhhhNhNubh)}(h``libbpf_get_error``h]hlibbpf_get_error}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHubh or }(hjHhhhNhNubh)}(h``libbpf_prog_type_by_name``h]hlibbpf_prog_type_by_name}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK:hj7hhubeh}(h]auxiliary-functionsah ]h"]auxiliary functionsah$]h&]uh1hhhhhhhhK8ubh)}(hhh](h)}(hABIh]hABI}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK?ubh)}(hX-libbpf can be both linked statically or used as DSO. To avoid possible conflicts with other libraries an application is linked with, all non-static libbpf symbols should have one of the prefixes mentioned in API documentation above. See API naming convention to choose the right name for a new symbol.h]hX-libbpf can be both linked statically or used as DSO. To avoid possible conflicts with other libraries an application is linked with, all non-static libbpf symbols should have one of the prefixes mentioned in API documentation above. See API naming convention to choose the right name for a new symbol.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjhhubeh}(h]abiah ]h"]abiah$]h&]uh1hhhhhhhhK?ubh)}(hhh](h)}(hSymbol visibilityh]hSymbol visibility}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKHubh)}(hlibbpf follow the model when all global symbols have visibility "hidden" by default and to make a symbol visible it has to be explicitly attributed with ``LIBBPF_API`` macro. For example:h](hlibbpf follow the model when all global symbols have visibility “hidden” by default and to make a symbol visible it has to be explicitly attributed with }(hjhhhNhNubh)}(h``LIBBPF_API``h]h LIBBPF_API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh macro. For example:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKJhjhhubh literal_block)}(h/LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id);h]h/LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id);}hjsbah}(h]h ]h"]h$]h&]hhforcelanguagechighlight_args}uh1jhhhKNhjhhubh)}(hThis prevents from accidentally exporting a symbol, that is not supposed to be a part of ABI what, in turn, improves both libbpf developer- and user-experiences.h]hThis prevents from accidentally exporting a symbol, that is not supposed to be a part of ABI what, in turn, improves both libbpf developer- and user-experiences.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjhhubeh}(h]symbol-visibilityah ]h"]symbol visibilityah$]h&]uh1hhhhhhhhKHubh)}(hhh](h)}(hABI versioningh]hABI versioning}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKWubh)}(hTo make future ABI extensions possible libbpf ABI is versioned. Versioning is implemented by ``libbpf.map`` version script that is passed to linker.h](h]To make future ABI extensions possible libbpf ABI is versioned. Versioning is implemented by }(hj(hhhNhNubh)}(h``libbpf.map``h]h libbpf.map}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(ubh) version script that is passed to linker.}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKYhjhhubh)}(h^Version name is ``LIBBPF_`` prefix + three-component numeric version, starting from ``0.0.1``.h](hVersion name is }(hjHhhhNhNubh)}(h ``LIBBPF_``h]hLIBBPF_}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHubh9 prefix + three-component numeric version, starting from }(hjHhhhNhNubh)}(h ``0.0.1``h]h0.0.1}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK]hjhhubh)}(hEvery time ABI is being changed, e.g. because a new symbol is added or semantic of existing symbol is changed, ABI version should be bumped. This bump in ABI version is at most once per kernel development cycle.h]hEvery time ABI is being changed, e.g. because a new symbol is added or semantic of existing symbol is changed, ABI version should be bumped. This bump in ABI version is at most once per kernel development cycle.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hjhhubh)}(h3For example, if current state of ``libbpf.map`` is:h](h!For example, if current state of }(hjhhhNhNubh)}(h``libbpf.map``h]h libbpf.map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh is:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKdhjhhubj)}(h|LIBBPF_0.0.1 { global: bpf_func_a; bpf_func_b; local: \*; };h]h|LIBBPF_0.0.1 { global: bpf_func_a; bpf_func_b; local: \*; };}hjsbah}(h]h ]h"]h$]h&]hhjjnonej}uh1jhhhKfhjhhubh)}(hg, and a new symbol ``bpf_func_c`` is being introduced, then ``libbpf.map`` should be changed like this:h](h, and a new symbol }(hjhhhNhNubh)}(h``bpf_func_c``h]h bpf_func_c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh is being introduced, then }(hjhhhNhNubh)}(h``libbpf.map``h]h libbpf.map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh should be changed like this:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKphjhhubj)}(hLIBBPF_0.0.1 { global: bpf_func_a; bpf_func_b; local: \*; }; LIBBPF_0.0.2 { global: bpf_func_c; } LIBBPF_0.0.1;h]hLIBBPF_0.0.1 { global: bpf_func_a; bpf_func_b; local: \*; }; LIBBPF_0.0.2 { global: bpf_func_c; } LIBBPF_0.0.1;}hjsbah}(h]h ]h"]h$]h&]hhjjnonej}uh1jhhhKshjhhubh)}(hN, where new version ``LIBBPF_0.0.2`` depends on the previous ``LIBBPF_0.0.1``.h](h, where new version }(hjhhhNhNubh)}(h``LIBBPF_0.0.2``h]h LIBBPF_0.0.2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh depends on the previous }(hjhhhNhNubh)}(h``LIBBPF_0.0.1``h]h LIBBPF_0.0.1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hrFormat of version script and ways to handle ABI changes, including incompatible ones, described in details in [1].h]hrFormat of version script and ways to handle ABI changes, including incompatible ones, described in details in [1].}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]abi-versioningah ]h"]abi versioningah$]h&]uh1hhhhhhhhKWubh)}(hhh](h)}(hStand-alone buildh]hStand-alone build}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhhhhhKubh)}(hUnder https://github.com/libbpf/libbpf there is a (semi-)automated mirror of the mainline's version of libbpf for a stand-alone build.h](hUnder }(hjShhhNhNubh reference)}(h https://github.com/libbpf/libbpfh]h https://github.com/libbpf/libbpf}(hj]hhhNhNubah}(h]h ]h"]h$]h&]refurij_uh1j[hjSubhb there is a (semi-)automated mirror of the mainline’s version of libbpf for a stand-alone build.}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjBhhubh)}(h_However, all changes to libbpf's code base must be upstreamed through the mainline kernel tree.h]haHowever, all changes to libbpf’s code base must be upstreamed through the mainline kernel tree.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjBhhubeh}(h]stand-alone-buildah ]h"]stand-alone buildah$]h&]uh1hhhhhhhhKubeh}(h]api-naming-conventionah ]h"]api naming conventionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hAPI documentation conventionh]hAPI documentation convention}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe libbpf API is documented via comments above definitions in header files. These comments can be rendered by doxygen and sphinx for well organized html output. This section describes the convention in which these comments should be formatted.h]hThe libbpf API is documented via comments above definitions in header files. These comments can be rendered by doxygen and sphinx for well organized html output. This section describes the convention in which these comments should be formatted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hHere is an example from btf.h:h]hHere is an example from btf.h:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hXr/** * @brief **btf__new()** creates a new instance of a BTF object from the raw * bytes of an ELF's BTF section * @param data raw bytes * @param size number of bytes passed in `data` * @return new BTF object instance which has to be eventually freed with * **btf__free()** * * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract * error code from such a pointer `libbpf_get_error()` should be used. If * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is * returned on error instead. In both cases thread-local `errno` variable is * always set to error code as well. */h]hXr/** * @brief **btf__new()** creates a new instance of a BTF object from the raw * bytes of an ELF's BTF section * @param data raw bytes * @param size number of bytes passed in `data` * @return new BTF object instance which has to be eventually freed with * **btf__free()** * * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract * error code from such a pointer `libbpf_get_error()` should be used. If * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is * returned on error instead. In both cases thread-local `errno` variable is * always set to error code as well. */}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjhhubh)}(h@The comment must start with a block comment of the form '/\*\*'.h]hDThe comment must start with a block comment of the form ‘/**’.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXThe documentation always starts with a @brief directive. This line is a short description about this API. It starts with the name of the API, denoted in bold like so: **api_name**. Please include an open and close parenthesis if this is a function. Follow with the short description of the API. A longer form description can be added below the last directive, at the bottom of the comment.h](hThe documentation always starts with a @brief directive. This line is a short description about this API. It starts with the name of the API, denoted in bold like so: }(hjhhhNhNubhstrong)}(h **api_name**h]hapi_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. Please include an open and close parenthesis if this is a function. Follow with the short description of the API. A longer form description can be added below the last directive, at the bottom of the comment.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hParameters are denoted with the @param directive, there should be one for each parameter. If this is a function with a non-void return, use the @return directive to document it.h]hParameters are denoted with the @param directive, there should be one for each parameter. If this is a function with a non-void return, use the @return directive to document it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(hLicenseh]hLicense}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h8libbpf is dual-licensed under LGPL 2.1 and BSD 2-Clause.h]h8libbpf is dual-licensed under LGPL 2.1 and BSD 2-Clause.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]licenseah ]h"]licenseah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hLinksh]hLinks}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hhhhhKubhdefinition_list)}(hhh]hdefinition_list_item)}(hX[1] https://www.akkadia.org/drepper/dsohowto.pdf (Chapter 3. Maintaining APIs and ABIs).h](hterm)}(h0[1] https://www.akkadia.org/drepper/dsohowto.pdfh](h[1] }(hjShhhNhNubj\)}(h,https://www.akkadia.org/drepper/dsohowto.pdfh]h,https://www.akkadia.org/drepper/dsohowto.pdf}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refurij]uh1j[hjSubeh}(h]h ]h"]h$]h&]uh1jQhhhKhjMubh definition)}(hhh]h)}(h'(Chapter 3. Maintaining APIs and ABIs).h]h'(Chapter 3. Maintaining APIs and ABIs).}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjrubah}(h]h ]h"]h$]h&]uh1jphjMubeh}(h]h ]h"]h$]h&]uh1jKhhhKhjHubah}(h]h ]h"]h$]h&]uh1jFhj5hhhhhNubeh}(h]linksah ]h"]linksah$]h&]uh1hhjhhhhhKubeh}(h]api-documentation-conventionah ]h"]api documentation conventionah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN 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}refids}nameids}(jjjjj4j1jjjjjjj?j<jjjjj2j/jju nametypes}(jjj4jjjj?jjj2juh}(jhjjUj1jjj7jjjjj<jjjBjjj/jjj5u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.