fix dynamic linker entry point for microblaze
authorRich Felker <dalias@aerifal.cx>
Sun, 15 Dec 2013 00:51:48 +0000 (19:51 -0500)
committerRich Felker <dalias@aerifal.cx>
Sun, 15 Dec 2013 00:51:48 +0000 (19:51 -0500)
the ABI allows the callee to clobber stack slots that correspond to
arguments passed in registers, so the caller must adjust the stack
pointer to reserve space appropriately. prior to this fix, the argv
array was possibly clobbered by dynamic linker code before passing
control to the main program.

src/ldso/microblaze/start.s

index 5ffbcba..4e0a0e5 100644 (file)
@@ -9,11 +9,12 @@ _start:
        addi    r7, r7, _GLOBAL_OFFSET_TABLE_+8
        addi    r7, r7, _DYNAMIC@GOTOFF
        brlid   r15, __reloc_self@PLT
-       nop
+       addik   r1, r1, -16
 
-       lwi     r5, r1, 0
+       lwi     r5, r1, 16
        brlid   r15, __dynlink@PLT
-       addi    r6, r1, 4
+       addi    r6, r1, 20
+       addik   r1, r1, 16
 
        lwi     r4, r1, 0
 1:     lwi     r5, r1, 4