public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections
@ 2026-03-04 16:06 Joe Lawrence
  2026-03-04 16:12 ` Joe Lawrence
  2026-03-04 19:33 ` Petr Pavlu
  0 siblings, 2 replies; 3+ messages in thread
From: Joe Lawrence @ 2026-03-04 16:06 UTC (permalink / raw)
  To: linux-modules, linux-kernel
  Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen,
	Aaron Tomlin, Petr Mladek, Josh Poimboeuf

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@redhat.com>
---
 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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections
  2026-03-04 16:06 [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections Joe Lawrence
@ 2026-03-04 16:12 ` Joe Lawrence
  2026-03-04 19:33 ` Petr Pavlu
  1 sibling, 0 replies; 3+ messages in thread
From: Joe Lawrence @ 2026-03-04 16:12 UTC (permalink / raw)
  To: linux-modules, linux-kernel
  Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen,
	Aaron Tomlin, Petr Mladek, Josh Poimboeuf

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@redhat.com>
> ---
>  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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections
  2026-03-04 16:06 [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections Joe Lawrence
  2026-03-04 16:12 ` Joe Lawrence
@ 2026-03-04 19:33 ` Petr Pavlu
  1 sibling, 0 replies; 3+ messages in thread
From: Petr Pavlu @ 2026-03-04 19:33 UTC (permalink / raw)
  To: Joe Lawrence
  Cc: Luis Chamberlain, Daniel Gomez, Sami Tolvanen, Aaron Tomlin,
	Petr Mladek, Josh Poimboeuf, linux-modules, linux-kernel

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 <joe.lawrence@redhat.com>
> ---
>  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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-03-04 19:33 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-04 16:06 [PATCH] module.lds: force 0 sh_addr for .text, .data, .bss, and .rodata sections Joe Lawrence
2026-03-04 16:12 ` Joe Lawrence
2026-03-04 19:33 ` Petr Pavlu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox