diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-06-25 16:06:09 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-06-25 16:06:09 -0400 |
commit | 9abab94b211c5103e3f6baf97ad76523618a553c (patch) | |
tree | ae363f61070eb73b8946127e3dada19067de0e4e | |
parent | ec820f1262a5d6331ad0fe9b56a8a84365766fd1 (diff) | |
download | musl-9abab94b211c5103e3f6baf97ad76523618a553c.tar.gz musl-9abab94b211c5103e3f6baf97ad76523618a553c.tar.xz musl-9abab94b211c5103e3f6baf97ad76523618a553c.zip |
fix arm crti/crtn code
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).
-rw-r--r-- | crt/arm/crti.s | 2 | ||||
-rw-r--r-- | crt/arm/crtn.s | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/crt/arm/crti.s b/crt/arm/crti.s index 2eb23ed5..0dd978a8 100644 --- a/crt/arm/crti.s +++ b/crt/arm/crti.s @@ -1,7 +1,9 @@ .section .init .global _init _init: + push {lr} .section .fini .global _fini _fini: + push {lr} diff --git a/crt/arm/crtn.s b/crt/arm/crtn.s index 9d7107d0..5d5d6454 100644 --- a/crt/arm/crtn.s +++ b/crt/arm/crtn.s @@ -1,9 +1,11 @@ .section .init + pop {lr} tst lr,#1 moveq pc,lr bx lr .section .fini + pop {lr} tst lr,#1 moveq pc,lr bx lr |