make sh crti/crtn init/fini fragments setup proper stack frame
authorRich Felker <dalias@aerifal.cx>
Sat, 12 Sep 2015 02:50:28 +0000 (02:50 +0000)
committerRich Felker <dalias@aerifal.cx>
Sat, 12 Sep 2015 02:50:28 +0000 (02:50 +0000)
for fdpic support is is essential that the got pointer be saved at a
known, ABI-dictated offset from the frame pointer, since there is no
way to recover it once it's lost.

crt/sh/crti.s
crt/sh/crtn.s

index 0410ab6..d99bfd5 100644 (file)
@@ -2,12 +2,20 @@
 .global  _init
 .type    _init, @function
 _init:
+       add #-4, r15
+       mov.l r12, @-r15
+       mov.l r14, @-r15
        sts.l pr, @-r15
+       mov r15, r14
        nop
 
 .section .fini
 .global  _fini
 .type    _fini, @function
 _fini:
+       add #-4, r15
+       mov.l r12, @-r15
+       mov.l r14, @-r15
        sts.l pr, @-r15
+       mov r15, r14
        nop
index dde633b..958ce95 100644 (file)
@@ -1,9 +1,13 @@
 .section .init
        lds.l @r15+, pr
+       mov.l @r15+, r14
+       mov.l @r15+, r12
        rts
-        nop
+        add #4, r15
 
 .section .fini
        lds.l @r15+, pr
+       mov.l @r15+, r14
+       mov.l @r15+, r12
        rts
-        nop
+        add #4, r15