diff options
author | Andreas Schwab <aschwab@redhat.com> | 2009-06-25 08:56:20 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-06-25 08:56:20 -0700 |
commit | 80a98966c802b76bb5afd7d59025c9db4b1bc9d8 (patch) | |
tree | 4d7da75d77fdce6c05af7ba2a5851098b7afcd69 | |
parent | 3f241d758415e050269ebd9b3b909f3d007f89e5 (diff) | |
download | glibc-80a98966c802b76bb5afd7d59025c9db4b1bc9d8.tar.gz glibc-80a98966c802b76bb5afd7d59025c9db4b1bc9d8.tar.xz glibc-80a98966c802b76bb5afd7d59025c9db4b1bc9d8.zip |
Fix text relocation on ppc32.
The ____longjmp_chk implementation didn't load from memory the right way.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/____longjmp_chk.S | 23 |
2 files changed, 26 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 3e1f365789..ca5d5b6de1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-06-25 Andreas Schwab <aschwab@redhat.com> + + * sysdeps/powerpc/powerpc32/____longjmp_chk.S (LOAD_ARG): Define. + (CHECK_SP): Use it. + 2009-06-24 Andreas Schwab <aschwab@redhat.com> * sysdeps/powerpc/powerpc32/power4/fpu/w_sqrtf.S: Fix cfa offset diff --git a/sysdeps/powerpc/powerpc32/____longjmp_chk.S b/sysdeps/powerpc/powerpc32/____longjmp_chk.S index 5c1f648661..510ce5250d 100644 --- a/sysdeps/powerpc/powerpc32/____longjmp_chk.S +++ b/sysdeps/powerpc/powerpc32/____longjmp_chk.S @@ -26,11 +26,30 @@ #define __longjmp ____longjmp_chk +#ifdef PIC +# ifdef HAVE_ASM_PPC_REL16 +# define LOAD_ARG \ + bcl 20,31,1f; \ +1: mflr r3; \ + addis r3,r3,_GLOBAL_OFFSET_TABLE_-1b@ha; \ + addi r3,r3,_GLOBAL_OFFSET_TABLE_-1b@l; \ + lwz r3,.LC0@got(r3) +# else +# define LOAD_ARG \ + bl _GLOBAL_OFFSET_TABLE_-4@local; \ + mflr r3; \ + lwz r3,.LC0@got(r3) +# endif +#else +# define LOAD_ARG \ + lis r3,.LC0@ha; \ + la r3,.LC0@l(r3) +#endif + #define CHECK_SP(reg) \ cmplw reg, r1; \ bge+ .Lok; \ - lis r3,.LC0@ha; \ - la r3,.LC0@l(r3); \ + LOAD_ARG; \ bl HIDDEN_JUMPTARGET (__fortify_fail); \ .Lok: |