Hi Marcus,

tested and pushed,
 best regards
  Waldemar

Marcus Hähnel wrote,

> Dear uclibc-ng devs,
> 
> The LLVM linker seems to be quite clever. When resolving relocations, 
> accesses to the GOT are potentially replaced by PC
> relative addressing to the requested symbol. This breaks the old method of 
> calculating the load address by using an
> unrelocated GOT entry value. Instead, rely on __ehdr_start having a link 
> address of zero.The LLVM linker seems to be quite
> clever. When resolving relocations, accesses to the GOT are potentially 
> replaced by PC relative addressing to the requested
> symbol. This breaks the old method of calculating the load address by using 
> an unrelocated GOT entry value. Instead, rely
> on __ehdr_start having a link address of zero.
> 
> The patch is attached.
> 
> Best regards,
> 
>  - Marcus
> 
> 
> -- 
> +++++++++++++++++++
> 
> 
> Register now for our workshop "Get to know L4Re in 3 days" on April 8-10. 
> Learn to design and deploy secure system
> architectures for your product with L4Re: 
> https://www.kernkonzept.com/workshop-getting-started-with-l4re/
> 
> +++++++++++++++++++
> 
> Kernkonzept GmbH
> Sitz: Dresden
> HRB 31129
> Geschäftsführer: Dr.-Ing. Michael Hohmuth
> 
> 

> From 2df8a64bb5bb31e9325f0d9157d68eddcd208d40 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Jan=20Kl=C3=B6tzke?= <[email protected]>
> Date: Wed, 19 Mar 2025 08:03:12 +0100
> Subject: [PATCH] Do not rely on unrelocated GOT entries
> 
> The LLVM linker seems to be quite clever. When resolving relocations,
> accesses to the GOT are potentially replaced by PC relative addressing
> to the requested symbol. This breaks the old method of calculating the
> load address by using an unrelocated GOT entry value. Instead, rely on
> __ehdr_start having a link address of zero.
> 
> Signed-off-by: Marcus Haehnel <[email protected]>
> ---
>  libc/sysdeps/linux/arm/crt1.S    | 15 ++++++---------
>  libc/sysdeps/linux/x86_64/crt1.S |  6 +-----
>  2 files changed, 7 insertions(+), 14 deletions(-)
> 
> diff --git a/libc/sysdeps/linux/arm/crt1.S b/libc/sysdeps/linux/arm/crt1.S
> index 799f11080..040ddfd27 100644
> --- a/libc/sysdeps/linux/arm/crt1.S
> +++ b/libc/sysdeps/linux/arm/crt1.S
> @@ -248,13 +248,9 @@ _start:
>  #if defined(__ARCH_USE_MMU__) || defined(__UCLIBC_FORMAT_ELF__)
>  #ifdef L_rcrt1
>       /* We don't need to save a1 since no dynamic linker should have run */
> -     ldr a1, .L_GOT          /* Get value at .L_GOT + 0  (offset to GOT)*/
> -     adr a2, .L_GOT          /* Get address of .L_GOT */
> -     ldr a3, .L_GOT+16       /* Get value of _start(GOT) stored in .L_GOT */
> -     adr a4, _start          /* Get address of _start after relocation 
> (changes to pc - ~30 or so) */
> -     add a1, a1, a2          /* Calculate where the GOT is */
> -     ldr a2, [a1, a3]        /* GOT + _start(GOT) = offset of _start from 
> begin of file */
> -     sub a1, a4, a2          /* Current addr of _start - offset from 
> beginning of file = load addr */
> +     adr a1, .L__ehdr_start_off  /* Get address of .L__ehdr_start_off */
> +     ldr a2, .L__ehdr_start_off  /* Offset from .L__ehdr_start_off to 
> __ehdr_start */
> +     add a1, a1, a2              /* Address of __ehdr_start = load addr */
>       bl reloc_static_pie
>       mov a1, #0              /* Clean up a1 so that a random address won't 
> get called at the end of program */
>  
> @@ -325,9 +321,10 @@ _start:
>       .word _fini(GOT)
>       .word _init(GOT)
>       .word main(GOT)
> -#ifdef L_rcrt1
> -     .word _start(GOT)
>  #endif
> +#ifdef L_rcrt1
> +.L__ehdr_start_off:
> +     .word __ehdr_start - .L__ehdr_start_off
>  #endif
>  #endif
>  
> diff --git a/libc/sysdeps/linux/x86_64/crt1.S 
> b/libc/sysdeps/linux/x86_64/crt1.S
> index 701cbf2f6..151aeffeb 100644
> --- a/libc/sysdeps/linux/x86_64/crt1.S
> +++ b/libc/sysdeps/linux/x86_64/crt1.S
> @@ -83,11 +83,7 @@ _start:
>  #ifdef L_rcrt1
>       pushq %rdi                          /* save rdi (but should be 0...) */
>       pushq %rdx                          /* store rdx (rtld_fini) */
> -     xorq %rcx, %rcx                     /* ensure rcx is 0 */
> -     addq _start@GOTPCREL(%rip), %rcx    /* get offset of _start from 
> beginning of file */
> -     movq _start@GOTPCREL(%rip), %rax    /* get run time address of _start */
> -     subq %rcx, %rax                     /* calculate run time load offset */
> -     movq %rax, %rdi                     /* load offset -> param 1 */
> +     lea  __ehdr_start(%rip), %rdi       /* "Calculate" load address... */
>       call reloc_static_pie               /* relocate dynamic addrs */
>       xorq %rax, %rax                     /* cleanup */
>       popq %rdx
> -- 
> 2.47.1
> 




> _______________________________________________
> devel mailing list -- [email protected]
> To unsubscribe send an email to [email protected]

_______________________________________________
devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to