mirror of
git://git.musl-libc.org/musl
synced 2024-12-25 16:12:48 +00:00
9f26ebded1
the instruction used to align the stack, "and $sp, $sp, -8", does not actually exist; it's expanded to 2 instructions using the 'at' (assembler temporary) register, and thus cannot be used in a branch delay slot. since alignment mod 16 commutes with subtracting 8, simply swapping these two operations fixes the problem. crt1.o was not affected because it's still being generated from a dedicated asm source file. dlstart.lo was not affected because the stack pointer it receives is already aligned by the kernel. but Scrt1.o was affected in cases where the dynamic linker gave it a misaligned stack pointer.
30 lines
575 B
C
30 lines
575 B
C
__asm__(
|
|
".set push\n"
|
|
".set noreorder\n"
|
|
".text \n"
|
|
".global _" START "\n"
|
|
".global " START "\n"
|
|
".type _" START ", @function\n"
|
|
".type " START ", @function\n"
|
|
"_" START ":\n"
|
|
"" START ":\n"
|
|
" bal 1f \n"
|
|
" move $fp, $0 \n"
|
|
"2: .gpword 2b \n"
|
|
" .gpword " START "_c \n"
|
|
".weak _DYNAMIC \n"
|
|
".hidden _DYNAMIC \n"
|
|
" .gpword _DYNAMIC \n"
|
|
"1: lw $gp, 0($ra) \n"
|
|
" subu $gp, $ra, $gp \n"
|
|
" move $4, $sp \n"
|
|
" lw $5, 8($ra) \n"
|
|
" addu $5, $5, $gp \n"
|
|
" lw $25, 4($ra) \n"
|
|
" addu $25, $25, $gp \n"
|
|
" and $sp, $sp, -8 \n"
|
|
" jalr $25 \n"
|
|
" subu $sp, $sp, 16 \n"
|
|
".set pop \n"
|
|
);
|