summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/powerpc
diff options
context:
space:
mode:
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>2007-01-05 10:20:37 +0000
committerJoakim Tjernlund <joakim.tjernlund@transmode.se>2007-01-05 10:20:37 +0000
commite26ed573b62f69d9813e72fda4ee3da6eaf4d7b7 (patch)
treeb089faf7543e285fe7076a6f28f77c32140c9687 /libc/sysdeps/linux/powerpc
parent3a3af36f1bef68c9942e9ef3fb83cc15aeabfcc0 (diff)
Support SecurePLTs for PowerPC. You need a toolchain that supports
config option --enable-secureplt. The assembler must also supports R_PPC_REL16* relocations. gcc 4.1.1 and binutils 2.17 is known to do this.
Diffstat (limited to 'libc/sysdeps/linux/powerpc')
-rw-r--r--libc/sysdeps/linux/powerpc/brk.S7
-rw-r--r--libc/sysdeps/linux/powerpc/bsd-_setjmp.S8
-rw-r--r--libc/sysdeps/linux/powerpc/bsd-setjmp.S8
-rw-r--r--libc/sysdeps/linux/powerpc/crt1.S7
-rw-r--r--libc/sysdeps/linux/powerpc/setjmp.S8
5 files changed, 23 insertions, 15 deletions
diff --git a/libc/sysdeps/linux/powerpc/brk.S b/libc/sysdeps/linux/powerpc/brk.S
index 25155ad46..5fe8d4086 100644
--- a/libc/sysdeps/linux/powerpc/brk.S
+++ b/libc/sysdeps/linux/powerpc/brk.S
@@ -50,8 +50,15 @@ brk:
lwz r6,8(r1)
#ifdef __PIC__
mflr r4
+# ifdef HAVE_ASM_PPC_REL16
+ bcl 20,31,1f
+1: mflr r5
+ addis r5,r5,_GLOBAL_OFFSET_TABLE_-1b@ha
+ addi r5,r5,_GLOBAL_OFFSET_TABLE_-1b@l
+# else
bl _GLOBAL_OFFSET_TABLE_@local-4
mflr r5
+# endif
lwz r5,__curbrk@got(r5)
mtlr r4
stw r3,0(r5)
diff --git a/libc/sysdeps/linux/powerpc/bsd-_setjmp.S b/libc/sysdeps/linux/powerpc/bsd-_setjmp.S
index d58e45b13..585878acf 100644
--- a/libc/sysdeps/linux/powerpc/bsd-_setjmp.S
+++ b/libc/sysdeps/linux/powerpc/bsd-_setjmp.S
@@ -29,9 +29,7 @@
_setjmp:
li r4,0 /* Set second argument to 0. */
-#ifdef __PIC__
- b __sigsetjmp@plt
-#else
- b __sigsetjmp
-#endif
+
+ b __sigsetjmp@local
+
.size _setjmp,.-_setjmp
diff --git a/libc/sysdeps/linux/powerpc/bsd-setjmp.S b/libc/sysdeps/linux/powerpc/bsd-setjmp.S
index 6128d9fa2..f95d08217 100644
--- a/libc/sysdeps/linux/powerpc/bsd-setjmp.S
+++ b/libc/sysdeps/linux/powerpc/bsd-setjmp.S
@@ -29,11 +29,9 @@
__setjmp:
li r4,1 /* Set second argument to 1. */
-#ifdef __PIC__
- b __sigsetjmp@plt
-#else
- b __sigsetjmp
-#endif
+
+ b __sigsetjmp@local
+
.size __setjmp,.-__setjmp
.globl setjmp;
diff --git a/libc/sysdeps/linux/powerpc/crt1.S b/libc/sysdeps/linux/powerpc/crt1.S
index 47419bb52..7928a7ed3 100644
--- a/libc/sysdeps/linux/powerpc/crt1.S
+++ b/libc/sysdeps/linux/powerpc/crt1.S
@@ -48,8 +48,15 @@ _start:
mr r9,r1 /* Save the stack pointer and pass it to __uClibc_main */
clrrwi r1,r1,4 /* Align stack ptr to 16 bytes */
#ifdef __PIC__
+# ifdef HAVE_ASM_PPC_REL16
+ bcl 20,31,1f
+1: mflr r31
+ addis r31,r31,_GLOBAL_OFFSET_TABLE_-1b@ha
+ addi r31,r31,_GLOBAL_OFFSET_TABLE_-1b@l
+# else
bl _GLOBAL_OFFSET_TABLE_-4@local
mflr r31
+# endif
#endif
/* Set up an initial stack frame, and clear the LR. */
li r0,0
diff --git a/libc/sysdeps/linux/powerpc/setjmp.S b/libc/sysdeps/linux/powerpc/setjmp.S
index b1625b615..3bdf6cbfe 100644
--- a/libc/sysdeps/linux/powerpc/setjmp.S
+++ b/libc/sysdeps/linux/powerpc/setjmp.S
@@ -76,9 +76,7 @@ FP( stfd fp29,((JB_FPRS+15*2)*4)(3))
FP( stfd fp30,((JB_FPRS+16*2)*4)(3))
stw r31,((JB_GPRS+17)*4)(3)
FP( stfd fp31,((JB_FPRS+17*2)*4)(3))
-#ifdef __PIC__
- b __sigjmp_save@plt
-#else
- b __sigjmp_save
-#endif
+
+ b __sigjmp_save@local
+
.size __sigsetjmp,.-__sigsetjmp