since .init and .fini are not .text, the toolchain does not seem to align them for code by default. this yields random breakage depending on the object sizes the linker is dealing with.
@@ -2,6 +2,7 @@
.section .init
.global _init
+.align 2
_init:
subu $sp,$sp,32
sw $gp,24($sp)
@@ -9,6 +10,7 @@ _init:
.section .fini
.global _fini
_fini: