mirror of https://git.musl-libc.org/git/musl
Browse Source
not heavily tested, but the basics are working. the basic concept is that the dynamic linker entry point code invokes a pure-PIC (no global accesses) C function in reloc.h to perform the early GOT relocations needed to make the dynamic linker itself functional, then invokes __dynlink like on other archs. since mips uses some ugly arch-specific hacks to optimize relocating the GOT (rather than just using the normal DT_REL[A] tables like on other archs), the dynamic linker has been modified slightly to support calling arch-specific relocation code in reloc.h. most of the actual mips-specific behavior was developed by reading the output of readelf on libc.so and simple executable files. i could not find good reference information on which relocation types need to be supported or their semantics, so it's possible that some legitimate usage cases will not work yet.rs-1.0
3 changed files with 102 additions and 3 deletions
@ -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 |
|||
Loading…
Reference in new issue