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
parent
881bf900bc
commit
cf9d692629
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue