mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:24:47 +01:00
livepatch: Fix having __klp_objects relics in non-livepatch modules
The linker script scripts/module.lds.S specifies that all input
__klp_objects sections should be consolidated into an output section of
the same name, and start/stop symbols should be created to enable
scripts/livepatch/init.c to locate this data.
This start/stop pattern is not ideal for modules because the symbols are
created even if no __klp_objects input sections are present.
Consequently, a dummy __klp_objects section also appears in the
resulting module. This unnecessarily pollutes non-livepatch modules.
Instead, since modules are relocatable files, the usual method for
locating consolidated data in a module is to read its section table.
This approach avoids the aforementioned problem.
The klp_modinfo already stores a copy of the entire section table with
the final addresses. Introduce a helper function that
scripts/livepatch/init.c can call to obtain the location of the
__klp_objects section from this data.
Fixes: dd590d4d57 ("objtool/klp: Introduce klp diff subcommand for diffing object files")
Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>
Link: https://patch.msgid.link/20260123102825.3521961-2-petr.pavlu@suse.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
parent
a8ff29f0ca
commit
ab10815472
4 changed files with 32 additions and 17 deletions
|
|
@ -9,19 +9,19 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/livepatch.h>
|
||||
|
||||
extern struct klp_object_ext __start_klp_objects[];
|
||||
extern struct klp_object_ext __stop_klp_objects[];
|
||||
|
||||
static struct klp_patch *patch;
|
||||
|
||||
static int __init livepatch_mod_init(void)
|
||||
{
|
||||
struct klp_object_ext *obj_exts;
|
||||
size_t obj_exts_sec_size;
|
||||
struct klp_object *objs;
|
||||
unsigned int nr_objs;
|
||||
int ret;
|
||||
|
||||
nr_objs = __stop_klp_objects - __start_klp_objects;
|
||||
|
||||
obj_exts = klp_find_section_by_name(THIS_MODULE, "__klp_objects",
|
||||
&obj_exts_sec_size);
|
||||
nr_objs = obj_exts_sec_size / sizeof(*obj_exts);
|
||||
if (!nr_objs) {
|
||||
pr_err("nothing to patch!\n");
|
||||
ret = -EINVAL;
|
||||
|
|
@ -41,7 +41,7 @@ static int __init livepatch_mod_init(void)
|
|||
}
|
||||
|
||||
for (int i = 0; i < nr_objs; i++) {
|
||||
struct klp_object_ext *obj_ext = __start_klp_objects + i;
|
||||
struct klp_object_ext *obj_ext = obj_exts + i;
|
||||
struct klp_func_ext *funcs_ext = obj_ext->funcs;
|
||||
unsigned int nr_funcs = obj_ext->nr_funcs;
|
||||
struct klp_func *funcs = objs[i].funcs;
|
||||
|
|
@ -90,12 +90,10 @@ err:
|
|||
|
||||
static void __exit livepatch_mod_exit(void)
|
||||
{
|
||||
unsigned int nr_objs;
|
||||
struct klp_object *obj;
|
||||
|
||||
nr_objs = __stop_klp_objects - __start_klp_objects;
|
||||
|
||||
for (int i = 0; i < nr_objs; i++)
|
||||
kfree(patch->objs[i].funcs);
|
||||
klp_for_each_object_static(patch, obj)
|
||||
kfree(obj->funcs);
|
||||
|
||||
kfree(patch->objs);
|
||||
kfree(patch);
|
||||
|
|
|
|||
|
|
@ -35,12 +35,7 @@ SECTIONS {
|
|||
__patchable_function_entries : { *(__patchable_function_entries) }
|
||||
|
||||
__klp_funcs 0: ALIGN(8) { KEEP(*(__klp_funcs)) }
|
||||
|
||||
__klp_objects 0: ALIGN(8) {
|
||||
__start_klp_objects = .;
|
||||
KEEP(*(__klp_objects))
|
||||
__stop_klp_objects = .;
|
||||
}
|
||||
__klp_objects 0: ALIGN(8) { KEEP(*(__klp_objects)) }
|
||||
|
||||
#ifdef CONFIG_ARCH_USES_CFI_TRAPS
|
||||
__kcfi_traps : { KEEP(*(.kcfi_traps)) }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue