aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-10-04 19:59:38 +0200
committerAndreas Schwab <schwab@linux-m68k.org>2016-10-09 21:43:50 +0200
commit3f413ec8d1aaa338946215f2510369f5e3d891eb (patch)
tree4437186243c10fe321f30aa8afa7c817d4c24cef /sysdeps
parentd0800ae0e7162631136a0042e87eb42c641455d9 (diff)
downloadglibc-3f413ec8d1aaa338946215f2510369f5e3d891eb.zip
glibc-3f413ec8d1aaa338946215f2510369f5e3d891eb.tar.gz
glibc-3f413ec8d1aaa338946215f2510369f5e3d891eb.tar.bz2
powerpc32: make PLT call in _mcount compatible with -msecure-plt (bug 20554)
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/powerpc/powerpc32/ppc-mcount.S27
1 files changed, 24 insertions, 3 deletions
diff --git a/sysdeps/powerpc/powerpc32/ppc-mcount.S b/sysdeps/powerpc/powerpc32/ppc-mcount.S
index 68df440..1d36b91 100644
--- a/sysdeps/powerpc/powerpc32/ppc-mcount.S
+++ b/sysdeps/powerpc/powerpc32/ppc-mcount.S
@@ -40,22 +40,38 @@
*/
ENTRY(_mcount)
+#if defined PIC && !defined SHARED
+# define CALLER_LR_OFFSET 68
+ stwu r1,-64(r1)
+ cfi_adjust_cfa_offset (64)
+ stw r30, 48(r1)
+ cfi_rel_offset (r30, 48)
+#else
+# define CALLER_LR_OFFSET 52
stwu r1,-48(r1)
cfi_adjust_cfa_offset (48)
+#endif
/* We need to save the parameter-passing registers. */
stw r3, 12(r1)
stw r4, 16(r1)
stw r5, 20(r1)
stw r6, 24(r1)
mflr r4
- lwz r3, 52(r1)
+#if defined PIC && !defined SHARED
+ bcl 20,31,0f
+0:
+ mflr r30
+ addis r30, r30, _GLOBAL_OFFSET_TABLE_-0b@ha
+ addi r30, r30, _GLOBAL_OFFSET_TABLE_-0b@l
+#endif
+ lwz r3, CALLER_LR_OFFSET(r1)
mfcr r5
stw r7, 28(r1)
stw r8, 32(r1)
stw r9, 36(r1)
stw r10,40(r1)
stw r4, 44(r1)
- cfi_offset (lr, -4)
+ cfi_rel_offset (lr, 44)
stw r5, 8(r1)
#ifndef SHARED
bl JUMPTARGET(__mcount_internal)
@@ -71,13 +87,18 @@ ENTRY(_mcount)
mtcrf 0xff,r6
lwz r5, 20(r1)
lwz r6, 24(r1)
- lwz r0, 52(r1)
+ lwz r0, CALLER_LR_OFFSET(r1)
lwz r7, 28(r1)
lwz r8, 32(r1)
mtlr r0
lwz r9, 36(r1)
lwz r10,40(r1)
/* ...unwind the stack frame, and return to your usual programming. */
+#if defined PIC && !defined SHARED
+ lwz r30, 48(r1)
+ addi r1,r1,64
+#else
addi r1,r1,48
+#endif
bctr
END(_mcount)