mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-14 06:44:44 -05:00
Livepatch needs some ELF magic which linkers don't like:
- Two relocation sections (.rela*, .klp.rela*) for the same text
section.
- Use of SHN_LIVEPATCH to mark livepatch symbols.
Unfortunately linkers tend to mangle such things. To work around that,
klp diff generates a linker-compliant intermediate binary which encodes
the relevant KLP section/reloc/symbol metadata.
After module linking, the .ko then needs to be converted to an actual
livepatch module. Introduce a new klp post-link subcommand to do so.
Acked-by: Petr Mladek <pmladek@suse.com>
Tested-by: Joe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
36 lines
1.0 KiB
C
36 lines
1.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
#ifndef _OBJTOOL_KLP_H
|
|
#define _OBJTOOL_KLP_H
|
|
|
|
#define SHF_RELA_LIVEPATCH 0x00100000
|
|
#define SHN_LIVEPATCH 0xff20
|
|
|
|
/*
|
|
* __klp_objects and __klp_funcs are created by klp diff and used by the patch
|
|
* module init code to build the klp_patch, klp_object and klp_func structs
|
|
* needed by the livepatch API.
|
|
*/
|
|
#define KLP_OBJECTS_SEC "__klp_objects"
|
|
#define KLP_FUNCS_SEC "__klp_funcs"
|
|
|
|
/*
|
|
* __klp_relocs is an intermediate section which are created by klp diff and
|
|
* converted into KLP symbols/relas by "objtool klp post-link". This is needed
|
|
* to work around the linker, which doesn't preserve SHN_LIVEPATCH or
|
|
* SHF_RELA_LIVEPATCH, nor does it support having two RELA sections for a
|
|
* single PROGBITS section.
|
|
*/
|
|
#define KLP_RELOCS_SEC "__klp_relocs"
|
|
#define KLP_STRINGS_SEC ".rodata.klp.str1.1"
|
|
|
|
struct klp_reloc {
|
|
void *offset;
|
|
void *sym;
|
|
u32 type;
|
|
};
|
|
|
|
int cmd_klp_diff(int argc, const char **argv);
|
|
int cmd_klp_post_link(int argc, const char **argv);
|
|
|
|
#endif /* _OBJTOOL_KLP_H */
|