diff options
Diffstat (limited to 'libc/sysdeps')
-rw-r--r-- | libc/sysdeps/linux/arm/crt1.S | 15 | ||||
-rw-r--r-- | 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 |