cleanup dynamic linker start code cruft
authorRich Felker <dalias@aerifal.cx>
Sun, 27 May 2012 18:49:55 +0000 (14:49 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 27 May 2012 18:49:55 +0000 (14:49 -0400)
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).

src/ldso/arm/start.s
src/ldso/i386/start.s
src/ldso/x86_64/start.s

index 359711e..2567578 100644 (file)
@@ -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
index 8e6a777..f6d4929 100644 (file)
@@ -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
index cb0a9e1..65e238b 100644 (file)
@@ -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