livepatch: Free klp_{object,func}_ext data after initialization

The klp_object_ext and klp_func_ext data, which are stored in the
__klp_objects and __klp_funcs sections, respectively, are not needed
after they are used to create the actual klp_object and klp_func
instances. This operation is implemented by the init function in
scripts/livepatch/init.c.

Prefix the two sections with ".init" so they are freed after the module
is initializated.

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-3-petr.pavlu@suse.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>

authored by Petr Pavlu and committed by Josh Poimboeuf b525fcaf ab108154

+10 -10
+1 -1
scripts/livepatch/init.c
··· 19 unsigned int nr_objs; 20 int ret; 21 22 - obj_exts = klp_find_section_by_name(THIS_MODULE, "__klp_objects", 23 &obj_exts_sec_size); 24 nr_objs = obj_exts_sec_size / sizeof(*obj_exts); 25 if (!nr_objs) {
··· 19 unsigned int nr_objs; 20 int ret; 21 22 + obj_exts = klp_find_section_by_name(THIS_MODULE, ".init.klp_objects", 23 &obj_exts_sec_size); 24 nr_objs = obj_exts_sec_size / sizeof(*obj_exts); 25 if (!nr_objs) {
+2 -2
scripts/module.lds.S
··· 34 35 __patchable_function_entries : { *(__patchable_function_entries) } 36 37 - __klp_funcs 0: ALIGN(8) { KEEP(*(__klp_funcs)) } 38 - __klp_objects 0: ALIGN(8) { KEEP(*(__klp_objects)) } 39 40 #ifdef CONFIG_ARCH_USES_CFI_TRAPS 41 __kcfi_traps : { KEEP(*(.kcfi_traps)) }
··· 34 35 __patchable_function_entries : { *(__patchable_function_entries) } 36 37 + .init.klp_funcs 0 : ALIGN(8) { KEEP(*(.init.klp_funcs)) } 38 + .init.klp_objects 0 : ALIGN(8) { KEEP(*(.init.klp_objects)) } 39 40 #ifdef CONFIG_ARCH_USES_CFI_TRAPS 41 __kcfi_traps : { KEEP(*(.kcfi_traps)) }
+1 -1
tools/objtool/check.c
··· 4761 !strcmp(sec->name, "__bug_table") || 4762 !strcmp(sec->name, "__ex_table") || 4763 !strcmp(sec->name, "__jump_table") || 4764 - !strcmp(sec->name, "__klp_funcs") || 4765 !strcmp(sec->name, "__mcount_loc") || 4766 !strcmp(sec->name, ".llvm.call-graph-profile") || 4767 !strcmp(sec->name, ".llvm_bb_addr_map") ||
··· 4761 !strcmp(sec->name, "__bug_table") || 4762 !strcmp(sec->name, "__ex_table") || 4763 !strcmp(sec->name, "__jump_table") || 4764 + !strcmp(sec->name, ".init.klp_funcs") || 4765 !strcmp(sec->name, "__mcount_loc") || 4766 !strcmp(sec->name, ".llvm.call-graph-profile") || 4767 !strcmp(sec->name, ".llvm_bb_addr_map") ||
+5 -5
tools/objtool/include/objtool/klp.h
··· 6 #define SHN_LIVEPATCH 0xff20 7 8 /* 9 - * __klp_objects and __klp_funcs are created by klp diff and used by the patch 10 - * module init code to build the klp_patch, klp_object and klp_func structs 11 - * needed by the livepatch API. 12 */ 13 - #define KLP_OBJECTS_SEC "__klp_objects" 14 - #define KLP_FUNCS_SEC "__klp_funcs" 15 16 /* 17 * __klp_relocs is an intermediate section which are created by klp diff and
··· 6 #define SHN_LIVEPATCH 0xff20 7 8 /* 9 + * .init.klp_objects and .init.klp_funcs are created by klp diff and used by the 10 + * patch module init code to build the klp_patch, klp_object and klp_func 11 + * structs needed by the livepatch API. 12 */ 13 + #define KLP_OBJECTS_SEC ".init.klp_objects" 14 + #define KLP_FUNCS_SEC ".init.klp_funcs" 15 16 /* 17 * __klp_relocs is an intermediate section which are created by klp diff and
+1 -1
tools/objtool/klp-diff.c
··· 1436 } 1437 1438 /* 1439 - * Create __klp_objects and __klp_funcs sections which are intermediate 1440 * sections provided as input to the patch module's init code for building the 1441 * klp_patch, klp_object and klp_func structs for the livepatch API. 1442 */
··· 1436 } 1437 1438 /* 1439 + * Create .init.klp_objects and .init.klp_funcs sections which are intermediate 1440 * sections provided as input to the patch module's init code for building the 1441 * klp_patch, klp_object and klp_func structs for the livepatch API. 1442 */