diff options
author | Alan Modra <amodra@gmail.com> | 2011-08-19 11:39:38 -0500 |
---|---|---|
committer | Ryan S. Arnold <rsa@us.ibm.com> | 2011-09-12 16:33:41 -0500 |
commit | 736d35d8016504c74c28cd9e8ffd3b45039535dc (patch) | |
tree | ed2339b38c27a05143dcafa5c1beb75a0ac80978 | |
parent | f0b0adf85a3550959fef4b8ee1d1a2b7f70befe8 (diff) | |
download | glibc-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-- | ChangeLog | 12 | ||||
-rw-r--r-- | sysdeps/powerpc/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/Makefile | 5 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/Versions | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/ppc-mcount.S | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/Makefile | 1 |
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 |