diff options
Diffstat (limited to 'libc/sysdeps/linux/arm')
-rw-r--r-- | libc/sysdeps/linux/arm/crt1.S | 15 |
1 files changed, 6 insertions, 9 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 |