On 3/4/26 5:06 PM, 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.

I had this issue with non-zero sh_addr values on my list of small things
to clean up for some time. I didn't realize it could cause an actual
problem. :/

> 
> 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 <[email protected]>
> ---
>  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*)
>       }

This looks ok but the same should be done for sections created via
MOD_SEPARATE_CODETAG_SECTIONS, namely .codetag.alloc_tags.

-- 
Thanks,
Petr

Reply via email to