Documentation/kbuild: Add new gendwarfksyms kABI rules

Document the "byte_size" and "type_string" kABI stability rules.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
pull/1260/head
Sami Tolvanen 2025-05-07 23:14:09 +00:00 committed by Masahiro Yamada
parent 881bf900bc
commit cf9d692629
1 changed files with 92 additions and 5 deletions

View File

@ -125,14 +125,17 @@ the rules. The fields are as follows:
qualified name of the DWARF Debugging Information Entry (DIE). qualified name of the DWARF Debugging Information Entry (DIE).
- `value`: Provides rule-specific data. - `value`: Provides rule-specific data.
The following helper macro, for example, can be used to specify rules The following helper macros, for example, can be used to specify rules
in the source code:: in the source code::
#define __KABI_RULE(hint, target, value) \ #define ___KABI_RULE(hint, target, value) \
static const char __PASTE(__gendwarfksyms_rule_, \ static const char __PASTE(__gendwarfksyms_rule_, \
__COUNTER__)[] __used __aligned(1) \ __COUNTER__)[] __used __aligned(1) \
__section(".discard.gendwarfksyms.kabi_rules") = \ __section(".discard.gendwarfksyms.kabi_rules") = \
"1\0" #hint "\0" #target "\0" #value "1\0" #hint "\0" target "\0" value
#define __KABI_RULE(hint, target, value) \
___KABI_RULE(hint, #target, #value)
Currently, only the rules discussed in this section are supported, but Currently, only the rules discussed in this section are supported, but
@ -223,6 +226,87 @@ Example usage::
KABI_ENUMERATOR_IGNORE(e, C); KABI_ENUMERATOR_IGNORE(e, C);
KABI_ENUMERATOR_VALUE(e, LAST, 2); KABI_ENUMERATOR_VALUE(e, LAST, 2);
Managing structure size changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A data structure can be partially opaque to modules if its allocation is
handled by the core kernel, and modules only need to access some of its
members. In this situation, it's possible to append new members to the
structure without breaking the ABI, as long as the layout for the original
members remains unchanged.
To append new members, we can hide them from symbol versioning as
described in section :ref:`Hiding members <hiding_members>`, but we can't
hide the increase in structure size. The `byte_size` rule allows us to
override the structure size used for symbol versioning.
The rule fields are expected to be as follows:
- `type`: "byte_size"
- `target`: The fully qualified name of the target data structure
(as shown in **--dump-dies** output).
- `value`: A positive decimal number indicating the structure size
in bytes.
Using the `__KABI_RULE` macro, this rule can be defined as::
#define KABI_BYTE_SIZE(fqn, value) \
__KABI_RULE(byte_size, fqn, value)
Example usage::
struct s {
/* Unchanged original members */
unsigned long a;
void *p;
/* Appended new members */
KABI_IGNORE(0, unsigned long n);
};
KABI_BYTE_SIZE(s, 16);
Overriding type strings
~~~~~~~~~~~~~~~~~~~~~~~
In rare situations where distributions must make significant changes to
otherwise opaque data structures that have inadvertently been included
in the published ABI, keeping symbol versions stable using the more
targeted kABI rules can become tedious. The `type_string` rule allows us
to override the full type string for a type or a symbol, and even add
types for versioning that no longer exist in the kernel.
The rule fields are expected to be as follows:
- `type`: "type_string"
- `target`: The fully qualified name of the target data structure
(as shown in **--dump-dies** output) or symbol.
- `value`: A valid type string (as shown in **--symtypes**) output)
to use instead of the real type.
Using the `__KABI_RULE` macro, this rule can be defined as::
#define KABI_TYPE_STRING(type, str) \
___KABI_RULE("type_string", type, str)
Example usage::
/* Override type for a structure */
KABI_TYPE_STRING("s#s",
"structure_type s { "
"member base_type int byte_size(4) "
"encoding(5) n "
"data_member_location(0) "
"} byte_size(8)");
/* Override type for a symbol */
KABI_TYPE_STRING("my_symbol", "variable s#s");
The `type_string` rule should be used only as a last resort if maintaining
a stable symbol versions cannot be reasonably achieved using other
means. Overriding a type string increases the risk of actual ABI breakages
going unnoticed as it hides all changes to the type.
Adding structure members Adding structure members
------------------------ ------------------------
@ -276,6 +360,8 @@ The examples include `KABI_(RESERVE|USE|REPLACE)*` macros that help
simplify the process and also ensure the replacement member is correctly simplify the process and also ensure the replacement member is correctly
aligned and its size won't exceed the reserved space. aligned and its size won't exceed the reserved space.
.. _hiding_members:
Hiding members Hiding members
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
@ -305,4 +391,5 @@ member to a union where one of the fields has a name starting with
unsigned long b; unsigned long b;
}; };
With **--stable**, both versions produce the same symbol version. With **--stable**, both versions produce the same symbol version. The
examples include a `KABI_IGNORE` macro to simplify the code.