From: Rich Felker Date: Sun, 27 May 2012 18:49:55 +0000 (-0400) Subject: cleanup dynamic linker start code cruft X-Git-Tag: v0.9.1~18 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b94608ca10051e7911250aaa53f1435b0512018c;p=oweals%2Fmusl.git cleanup dynamic linker start code cruft two actual issues: one is that __dynlink no longer wants/needs a GOT pointer argument, so the code to generate that argument can be removed. the other issue was that in the i386 code, argc/argv were being loaded into registers that would be call-clobbered, then copied to preserved registers, rather than just being loaded into the proper call-preserved registers to begin with. this cleanup is in preparation for adding new dynamic linker functionality (ability to explicitly invoke the dynamic linker to run a program). --- diff --git a/src/ldso/arm/start.s b/src/ldso/arm/start.s index 359711e1..25675782 100644 --- a/src/ldso/arm/start.s +++ b/src/ldso/arm/start.s @@ -3,12 +3,9 @@ _start: ldr r0,[sp] add r1,sp,#4 - ldr r2,2f - add r2,pc,r2 -1: bl __dynlink + bl __dynlink mov r1,r0 mov r0,#0 tst r1,#1 moveq pc,r1 bx r1 -2: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4 diff --git a/src/ldso/i386/start.s b/src/ldso/i386/start.s index 8e6a777d..f6d49291 100644 --- a/src/ldso/i386/start.s +++ b/src/ldso/i386/start.s @@ -2,16 +2,13 @@ .global _start _start: xor %ebp,%ebp - pop %ecx - mov %esp,%eax + pop %edi + mov %esp,%esi and $-16,%esp - mov %eax,%esi - mov %ecx,%edi push %ebp - call 1f -1: addl $_GLOBAL_OFFSET_TABLE_,(%esp) - push %eax - push %ecx + push %ebp + push %esi + push %edi call __dynlink mov %esi,%esp push %edi diff --git a/src/ldso/x86_64/start.s b/src/ldso/x86_64/start.s index cb0a9e1f..65e238b7 100644 --- a/src/ldso/x86_64/start.s +++ b/src/ldso/x86_64/start.s @@ -3,7 +3,6 @@ _start: mov (%rsp),%rdi lea 8(%rsp),%rsi - lea _GLOBAL_OFFSET_TABLE_(%rip),%rdx call __dynlink xor %edx,%edx jmp *%rax