lr must be saved because init/fini-section code from the compiler
clobbers it. this was not a problem when i tested without gcc's
crtbegin/crtend files present, but with them, musl on arm fails to
work (infinite loop in _init).
.section .init
.global _init
_init:
.section .init
.global _init
_init:
.section .fini
.global _fini
_fini:
.section .fini
.global _fini
_fini:
tst lr,#1
moveq pc,lr
bx lr
.section .fini
tst lr,#1
moveq pc,lr
bx lr
.section .fini
tst lr,#1
moveq pc,lr
bx lr
tst lr,#1
moveq pc,lr
bx lr