summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <aschwab@redhat.com>2009-06-25 08:56:20 -0700
committerUlrich Drepper <drepper@redhat.com>2009-06-25 08:56:20 -0700
commit80a98966c802b76bb5afd7d59025c9db4b1bc9d8 (patch)
tree4d7da75d77fdce6c05af7ba2a5851098b7afcd69
parent3f241d758415e050269ebd9b3b909f3d007f89e5 (diff)
Fix text relocation on ppc32.
The ____longjmp_chk implementation didn't load from memory the right way.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/powerpc/powerpc32/____longjmp_chk.S23
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: