From e26ed573b62f69d9813e72fda4ee3da6eaf4d7b7 Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Fri, 5 Jan 2007 10:20:37 +0000 Subject: 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. --- libc/sysdeps/linux/powerpc/brk.S | 7 +++++++ libc/sysdeps/linux/powerpc/bsd-_setjmp.S | 8 +++----- libc/sysdeps/linux/powerpc/bsd-setjmp.S | 8 +++----- libc/sysdeps/linux/powerpc/crt1.S | 7 +++++++ libc/sysdeps/linux/powerpc/setjmp.S | 8 +++----- 5 files changed, 23 insertions(+), 15 deletions(-) (limited to 'libc/sysdeps/linux') 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 -- cgit v1.2.3