mirror of
git://git.musl-libc.org/musl
synced 2024-12-27 01:02:12 +00:00
259071c249
it's naturally aligned when entered with the kernel argv array, but if ld.so has been invoked explicitly to run a program, the stack will not be aligned due to having thrown away argv[0].
27 lines
878 B
ArmAsm
27 lines
878 B
ArmAsm
.set noreorder
|
|
|
|
.weak _init
|
|
.weak _fini
|
|
.global __start
|
|
.global _start
|
|
__start:
|
|
_start:
|
|
subu $fp, $fp, $fp # Zero the frame pointer.
|
|
lui $gp, %hi(_gp)
|
|
addi $gp, %lo(_gp)
|
|
#la $gp, _gp
|
|
lw $4, %call16(main)($gp) # Get main() ...
|
|
lw $5, ($sp) # Get argc...
|
|
addu $6, $sp, 4 # and argv ...
|
|
lw $7, %call16(_init)($gp) # and _init() ...
|
|
and $sp, $sp, -8 # Align the stack pointer to 8 bytes
|
|
addi $sp, $sp, -4*6 # Leave space for arguments 0..3, arg4, and arg5.
|
|
lw $12, %call16(_fini)($gp) # and _fini() ...
|
|
sw $12, 4*4($sp) # Save arg4.
|
|
sw $0, 4*5($sp) # ldso_fini == NULL
|
|
lw $25, %call16(__libc_start_main)($gp)
|
|
jalr $25 # Let's go!
|
|
nop
|
|
b . # Never gets here.
|
|
nop
|