mips dynamic linker support
[musl] / src / ldso / mips / start.s
diff --git a/src/ldso/mips/start.s b/src/ldso/mips/start.s
new file mode 100644 (file)
index 0000000..d060dbc
--- /dev/null
@@ -0,0 +1,46 @@
+.hidden _DYNAMIC
+.hidden __reloc_self
+.set noreorder
+.set nomacro
+.global _start
+.type _start,@function
+_start:
+       move $fp, $0
+
+       bgezal $0, 1f
+       nop
+2:     .gpword 2b
+       .gpword _DYNAMIC
+       .gpword __reloc_self
+1:     lw $gp, 0($ra)
+       subu $gp, $ra, $gp
+
+       lw $4, 0($sp)
+       addiu $5, $sp, 4
+       lw $6, 4($ra)
+       addu $6, $6, $gp
+       addiu $7, $gp, -0x7ff0
+       subu $sp, $sp, 16
+       lw $25, 8($ra)
+       add $25, $25, $gp
+       jalr $25
+       nop
+
+       lw $25, %call16(__dynlink)($gp)
+       lw $4, 16($sp)
+       addiu $5, $sp, 20
+       jalr $25
+       nop
+
+       add $sp, $sp, 16
+       li $6, -1
+1:     lw $4, ($sp)
+       lw $5, 4($sp)
+       bne $5, $6, 2f
+       nop
+       addu $sp, $sp, 4
+       addu $4, $4, -4
+       b 1b
+       nop
+2:     sw $4, ($sp)
+       jr $2