[PATCH] sparc: Fix argument passing to __libc_start_main (BZ 32981)

Florian Weimer fweimer@redhat.com
Tue Jun 3 08:45:40 GMT 2025


* Adhemerval Zanella:

> sparc start.S does not provide the final argument for
> __libc_start_main, which is the highest stack address used to
> update the __libc_stack_end.A
>
> This fixes elf/tst-execstack-prog-static-tunable on sparc64.
> On sparcv9 this does not happen because the kernel puts an
> auxv value, which turns to point to a value in the stack itself.
>
> Checked on sparc64-linux-gnu.
> ---
>  sysdeps/sparc/sparc32/start.S | 4 ++++
>  sysdeps/sparc/sparc64/start.S | 4 ++++
>  2 files changed, 8 insertions(+)
>
> diff --git a/sysdeps/sparc/sparc32/start.S b/sysdeps/sparc/sparc32/start.S
> index 694b020ce0..cef7c96cac 100644
> --- a/sysdeps/sparc/sparc32/start.S
> +++ b/sysdeps/sparc/sparc32/start.S
> @@ -73,6 +73,10 @@ _start:
>       be NULL.  */
>  	mov	%g1, %o5
>  
> +  /* Provide the highest stack address to update the __libc_stack_end (used
> +     to enable executable stacks if required).  */
> +	st	%sp, [%sp+23*4]
> +
>    /* Let libc do the rest of the initialization, and call main.  */
>  	call	__libc_start_main
>  	 nop
> diff --git a/sysdeps/sparc/sparc64/start.S b/sysdeps/sparc/sparc64/start.S
> index c9c25c2e47..08e1e77210 100644
> --- a/sysdeps/sparc/sparc64/start.S
> +++ b/sysdeps/sparc/sparc64/start.S
> @@ -74,6 +74,10 @@ _start:
>       be NULL.  */
>  	mov     %g1, %o5
>  
> +  /* Provide the highest stack address to update the __libc_stack_end (used
> +     to enable executable stacks if required).  */
> +	stx	%sp, [%sp+STACK_BIAS+22*8]

Double-checked by compiling a similar call.  The offsets appear to be
correct.

Reviewed-by: Florian Weimer <fweimer@redhat.com>

Thanks,
Florian



More information about the Libc-alpha mailing list