Re: [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections
From: Joe Lawrence
Date: Wed Mar 04 2026 - 11:18:49 EST
On Wed, Mar 04, 2026 at 11:06:11AM -0500, Joe Lawrence wrote:
> Commit 1ba9f8979426 ("vmlinux.lds: Unify TEXT_MAIN, DATA_MAIN, and
> related macros") added .text and made .data, .bss, and .rodata sections
> unconditional in the module linker script, but without an explicit
> address like the other sections in the same file.
>
> When linking modules with ld.bfd -r, sections defined without an address
> inherit the location counter, resulting in non-zero sh_addr values in
> the .ko. Relocatable objects are expected to have sh_addr=0 for these
> sections and these non-zero addresses confuse elfutils and have been
> reported to cause segmentation faults in SystemTap [1].
>
> Add the 0 address specifier to .text, .bss, .data, and .rodata, and also
> to __patchable_function_entries and __kcfi_traps which had the same
> issue.
>
> Link: https://sourceware.org/bugzilla/show_bug.cgi?id=33958
> Fixes: 1ba9f8979426 ("vmlinux.lds: Unify TEXT_MAIN, DATA_MAIN, and related macros")
> Signed-off-by: Joe Lawrence <joe.lawrence@xxxxxxxxxx>
> ---
> scripts/module.lds.S | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/scripts/module.lds.S b/scripts/module.lds.S
> index 054ef99e8288..e1cab3cee3f7 100644
> --- a/scripts/module.lds.S
> +++ b/scripts/module.lds.S
> @@ -32,30 +32,30 @@ SECTIONS {
> __jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
> __ex_table 0 : ALIGN(4) { KEEP(*(__ex_table)) }
>
> - __patchable_function_entries : { *(__patchable_function_entries) }
> + __patchable_function_entries 0 : { *(__patchable_function_entries) }
>
> .init.klp_funcs 0 : ALIGN(8) { KEEP(*(.init.klp_funcs)) }
> .init.klp_objects 0 : ALIGN(8) { KEEP(*(.init.klp_objects)) }
>
> #ifdef CONFIG_ARCH_USES_CFI_TRAPS
> - __kcfi_traps : { KEEP(*(.kcfi_traps)) }
> + __kcfi_traps 0 : { KEEP(*(.kcfi_traps)) }
> #endif
>
> - .text : {
> + .text 0 : {
> *(.text .text.[0-9a-zA-Z_]*)
> }
>
> - .bss : {
> + .bss 0 : {
> *(.bss .bss.[0-9a-zA-Z_]*)
> *(.bss..L*)
> }
>
> - .data : {
> + .data 0 : {
> *(.data .data.[0-9a-zA-Z_]*)
> *(.data..L*)
> }
>
> - .rodata : {
> + .rodata 0 : {
> *(.rodata .rodata.[0-9a-zA-Z_]*)
> *(.rodata..L*)
> }
> --
> 2.53.0
>
Linker files are not my usual gig, but I offer up this patch as a
strawman to raise awareness to those who might know better :D
This was very lightly tested: readelf reports 0 sh_addrs after the
change for the affected sections and stap was happier parsing this.
Thanks,
--
Joe