about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2011-08-19 11:39:38 -0500
committerRyan S. Arnold <rsa@us.ibm.com>2011-09-12 16:33:41 -0500
commit736d35d8016504c74c28cd9e8ffd3b45039535dc (patch)
treeed2339b38c27a05143dcafa5c1beb75a0ac80978
parentf0b0adf85a3550959fef4b8ee1d1a2b7f70befe8 (diff)
downloadglibc-736d35d8016504c74c28cd9e8ffd3b45039535dc.tar.gz
glibc-736d35d8016504c74c28cd9e8ffd3b45039535dc.tar.xz
glibc-736d35d8016504c74c28cd9e8ffd3b45039535dc.zip
Fix profiling on powerpc32 secure-plt shared libs and PIEs
This patch moves the ppc32 _mcount to libc_shared.a, fixing a
long-standing bug with profiling of secure-plt shared libraries and
PIEs.  The problem is that a ppc32 PIC PLT call stub uses r30 (GOT
pointer) to load the function address from the PLT, r30 being set up
in the function prologue, but _mcount is called before the function
prologue.  So chances are good that r30 will be pointing to the
executable GOT when trying to call _mcount in a shared lib function.
A similar problem can occur in a PIE if a shared lib calls a function
in the executable.
-rw-r--r--ChangeLog12
-rw-r--r--sysdeps/powerpc/Makefile4
-rw-r--r--sysdeps/powerpc/powerpc32/Makefile5
-rw-r--r--sysdeps/powerpc/powerpc32/Versions3
-rw-r--r--sysdeps/powerpc/powerpc32/ppc-mcount.S3
-rw-r--r--sysdeps/powerpc/powerpc64/Makefile1
6 files changed, 22 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index f77f1714a0..ee2ccdc4f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,18 @@
 	* sysdeps/ieee754/ldbl-128ibm/s_fmal.c: New file which checks
 	for finite and infinity parameters.
 
+2011-08-15  Alan Modra  <amodra@gmail.com>
+
+	PR 13092
+	* sysdeps/powerpc/Makefile (gmon): Move sysdep_routines to..
+	* sysdeps/powerpc/powerpc64/Makefile (gmon): ..here..
+	* sysdeps/powerpc/powerpc32/Makefile (gmon): ..and here.  Add
+	ppc_mcount to static-only-routines.
+	* sysdeps/powerpc/powerpc32/Versions: Export GLIBC_PRIVATE
+	__mcount_internal.
+	* sysdeps/powerpc/powerpc32/ppc-mcount.S (_mcount): Call
+	__mcount_internal with usual JUMPTARGET.  Remove useless nop.
+
 2011-08-04  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
 	* sysdeps/powerpc/powerpc32/power7/strncmp.S: Adjust the alignment
diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile
index 616458f136..e43ca704f0 100644
--- a/sysdeps/powerpc/Makefile
+++ b/sysdeps/powerpc/Makefile
@@ -2,10 +2,6 @@
 # machine.
 +cflags += -mnew-mnemonics
 
-ifeq ($(subdir),gmon)
-sysdep_routines += ppc-mcount
-endif
-
 ifeq ($(subdir),string)
 CFLAGS-memcmp.c += -Wno-uninitialized
 endif
diff --git a/sysdeps/powerpc/powerpc32/Makefile b/sysdeps/powerpc/powerpc32/Makefile
index 1d58a063d6..ed24484c2e 100644
--- a/sysdeps/powerpc/powerpc32/Makefile
+++ b/sysdeps/powerpc/powerpc32/Makefile
@@ -5,6 +5,11 @@ ifeq ($(with-fp),no)
 sysdep-LDFLAGS += -msoft-float
 endif
 
+ifeq ($(subdir),gmon)
+sysdep_routines += ppc-mcount
+static-only-routines += ppc-mcount
+endif
+
 ifeq ($(subdir),misc)
 sysdep_routines += gprsave0 gprrest0 gprsave1 gprrest1
 endif
diff --git a/sysdeps/powerpc/powerpc32/Versions b/sysdeps/powerpc/powerpc32/Versions
index 3635c4a4a1..ad4972e4dd 100644
--- a/sysdeps/powerpc/powerpc32/Versions
+++ b/sysdeps/powerpc/powerpc32/Versions
@@ -8,6 +8,9 @@ libc {
     __fixsfdi; __fixunssfdi;
     __floatdidf; __floatdisf;
   }
+  GLIBC_PRIVATE {
+    __mcount_internal;
+  }
 }
 
 libm {
diff --git a/sysdeps/powerpc/powerpc32/ppc-mcount.S b/sysdeps/powerpc/powerpc32/ppc-mcount.S
index 7e39acb55b..0460ef18d8 100644
--- a/sysdeps/powerpc/powerpc32/ppc-mcount.S
+++ b/sysdeps/powerpc/powerpc32/ppc-mcount.S
@@ -58,8 +58,7 @@ ENTRY(_mcount)
 	stw	r4, 44(r1)
 	cfi_offset (lr, -4)
 	stw	r5,  8(r1)
-	bl	__mcount_internal@local
-	nop
+	bl      JUMPTARGET(__mcount_internal)
  /* Restore the registers...  */
 	lwz     r6,  8(r1)
 	lwz	r0, 44(r1)
diff --git a/sysdeps/powerpc/powerpc64/Makefile b/sysdeps/powerpc/powerpc64/Makefile
index 78d4f07e57..c7cc601ec4 100644
--- a/sysdeps/powerpc/powerpc64/Makefile
+++ b/sysdeps/powerpc/powerpc64/Makefile
@@ -42,4 +42,5 @@ ifeq ($(subdir),gmon)
 # Compiling with -msoft-float ensures that fp regs are not used
 # for moving memory around.
 CFLAGS-mcount.c += $(no-special-regs)
+sysdep_routines += ppc-mcount
 endif