diff options
author | Joseph Myers <joseph@codesourcery.com> | 2014-12-17 18:10:37 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2014-12-17 18:10:37 +0000 |
commit | ea41469b7ab2c8e35b1c10054f7076a95f80003a (patch) | |
tree | dea4be59a0db46f351b806421cbdeef9c4ee3de6 /sysdeps | |
parent | 8ac5a76a99e51a91eac9cecbe941fc05ddf11e03 (diff) | |
download | glibc-ea41469b7ab2c8e35b1c10054f7076a95f80003a.tar.gz glibc-ea41469b7ab2c8e35b1c10054f7076a95f80003a.tar.xz glibc-ea41469b7ab2c8e35b1c10054f7076a95f80003a.zip |
Fix profil_counter namespace (bug 17725).
On ARM, where profil_counter is not static, it is brought in by references to various standard functions, as noted in <https://sourceware.org/ml/libc-alpha/2014-11/msg00890.html>, although it is not a standard function itself. I don't know if this also causes test failures on SPARC, although I see no reason for it not to do so. This patch fixes this namespace issue. profil_counter is renamed to __profil_counter and made a weak alias on ARM and SPARC. Because of the uses in profil.c / sprofil.c it seems simplest to make the rename globally, including on the other architectures for which profil_counter was static and so the change is of no substance. The variant names profil_counter_* used in sprofil.c are also renamed to start with __ so that undesired function names do not get exported in static libc. As I noted in bug 17726, profil_counter should probably be a compat symbol on ARM and SPARC, so it wouldn't exist at all in static libc even as a weak alias. Since defining a compat symbol still requires an internal name as a target of an alias, this patch still seems reasonable as an intermediate step towards that goal: it wouldn't be possible for the function simply to be static profil_counter on ARM and SPARC with profil_counter also being the exported compat symbol name, so profil.c / sprofil.c would still need to be prepared to call the function under another name (here, __profil_counter). Tested for x86_64 (testsuite, and that stripped installed shared libraries are unchanged by the patch) and ARM (ABI and linknamespace tests - this patch reduces the number of linknamespace failures I see on ARM from 227 to 5, the residue being math.h failures for fe* functions and for j0l/j1n/jnl/y0l/y1l/ynl aliases). 2014-12-17 Joseph Myers <joseph@codesourcery.com> [BZ #17725] * sysdeps/generic/profil-counter.h (profil_counter): Rename to __profil_counter. * sysdeps/unix/sysv/linux/hppa/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/i386/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/ia64/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/sh/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/tile/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/x86_64/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/arm/profil-counter.h (profil_counter): Likewise. [!__profil_counter] (profil_counter): Define as weak alias of __profil_counter. * sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h (profil_counter): Rename to __profil_counter. [!__profil_counter] (profil_counter): Define as weak alias of __profil_counter. * sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h (profil_counter): Rename to __profil_counter. [!__profil_counter] (profil_counter): Define as weak alias of __profil_counter. * sysdeps/posix/profil.c: Update comment referring to profil_counter. (__profil): Use __profil_counter instead of profil_counter. * sysdeps/posix/sprofil.c (profil_counter): Rename to __profil_counter. Use __profil_counter_ushort and __profil_counter_uint in definitions. (__sprofil): Use __profil_counter_uint and __profil_counter_ushort instead of profil_counter_uint and profil_counter_ushort.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/posix/profil.c | 4 | ||||
-rw-r--r-- | sysdeps/posix/sprofil.c | 12 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/profil-counter.h | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sh/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/tile/profil-counter.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/profil-counter.h | 2 |
14 files changed, 29 insertions, 20 deletions
diff --git a/sysdeps/generic/profil-counter.h b/sysdeps/generic/profil-counter.h index 4ff9b496cf..52800c8ad1 100644 --- a/sysdeps/generic/profil-counter.h +++ b/sysdeps/generic/profil-counter.h @@ -20,7 +20,7 @@ and the interrupted PC is easily findable in the `struct sigcontext'. */ static void -profil_counter (int signr, int code, struct sigcontext *scp) +__profil_counter (int signr, int code, struct sigcontext *scp) { profil_count ((void *) scp->sc_pc); } diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c index 54ace22537..7128cb7a8b 100644 --- a/sysdeps/posix/profil.c +++ b/sysdeps/posix/profil.c @@ -48,7 +48,7 @@ profil_count (void *pc) ++samples[i]; } -/* Get the machine-dependent definition of `profil_counter', the signal +/* Get the machine-dependent definition of `__profil_counter', the signal handler for SIGPROF. It calls `profil_count' (above) with the PC of the interrupted code. */ #include "profil-counter.h" @@ -103,7 +103,7 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) pc_offset = offset; pc_scale = scale; - act.sa_handler = (sighandler_t) &profil_counter; + act.sa_handler = (sighandler_t) &__profil_counter; act.sa_flags = SA_RESTART; __sigfillset (&act.sa_mask); if (__sigaction (SIGPROF, &act, oact_ptr) < 0) diff --git a/sysdeps/posix/sprofil.c b/sysdeps/posix/sprofil.c index 0e19d16c23..e2b7a4922b 100644 --- a/sysdeps/posix/sprofil.c +++ b/sysdeps/posix/sprofil.c @@ -175,17 +175,17 @@ profil_count_uint (void *pcp) profil_count (pcp, 1); } -/* Get the machine-dependent definition of `profil_counter', the signal +/* Get the machine-dependent definition of `__profil_counter', the signal handler for SIGPROF. It calls `profil_count' (above) with the PC of the interrupted code. */ -#define profil_counter profil_counter_ushort +#define __profil_counter __profil_counter_ushort #define profil_count(pc) profil_count (pc, 0) #include <profil-counter.h> -#undef profil_counter +#undef __profil_counter #undef profil_count -#define profil_counter profil_counter_uint +#define __profil_counter __profil_counter_uint #define profil_count(pc) profil_count (pc, 1) #include <profil-counter.h> @@ -334,9 +334,9 @@ __sprofil (struct prof *profp, int profcnt, struct timeval *tvp, /* Install SIGPROF handler. */ if (flags & PROF_UINT) - act.sa_handler = (sighandler_t) &profil_counter_uint; + act.sa_handler = (sighandler_t) &__profil_counter_uint; else - act.sa_handler = (sighandler_t) &profil_counter_ushort; + act.sa_handler = (sighandler_t) &__profil_counter_ushort; act.sa_flags = SA_RESTART; __sigfillset (&act.sa_mask); if (__sigaction (SIGPROF, &act, &prof_info.saved_action) < 0) diff --git a/sysdeps/unix/sysv/linux/arm/profil-counter.h b/sysdeps/unix/sysv/linux/arm/profil-counter.h index ddf4d41af2..908bd6e05c 100644 --- a/sysdeps/unix/sysv/linux/arm/profil-counter.h +++ b/sysdeps/unix/sysv/linux/arm/profil-counter.h @@ -20,7 +20,7 @@ #include <sigcontextinfo.h> void -profil_counter (int signo, const SIGCONTEXT scp) +__profil_counter (int signo, const SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); @@ -29,3 +29,6 @@ profil_counter (int signo, const SIGCONTEXT scp) the signal context. */ asm volatile (""); } +#ifndef __profil_counter +weak_alias (__profil_counter, profil_counter) +#endif diff --git a/sysdeps/unix/sysv/linux/hppa/profil-counter.h b/sysdeps/unix/sysv/linux/hppa/profil-counter.h index 1561672d94..85c4712391 100644 --- a/sysdeps/unix/sysv/linux/hppa/profil-counter.h +++ b/sysdeps/unix/sysv/linux/hppa/profil-counter.h @@ -17,7 +17,7 @@ <http://www.gnu.org/licenses/>. */ static void -profil_counter (int signr, siginfo_t *si, struct ucontext *uctx) +__profil_counter (int signr, siginfo_t *si, struct ucontext *uctx) { unsigned long ip = uctx->uc_mcontext.sc_iaoq[0] & ~0x3; profil_count ((void *) ip); diff --git a/sysdeps/unix/sysv/linux/i386/profil-counter.h b/sysdeps/unix/sysv/linux/i386/profil-counter.h index 0bd60cbce2..c414619630 100644 --- a/sysdeps/unix/sysv/linux/i386/profil-counter.h +++ b/sysdeps/unix/sysv/linux/i386/profil-counter.h @@ -20,7 +20,7 @@ #include <sigcontextinfo.h> static void -profil_counter (int signo, const SIGCONTEXT scp) +__profil_counter (int signo, const SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); diff --git a/sysdeps/unix/sysv/linux/ia64/profil-counter.h b/sysdeps/unix/sysv/linux/ia64/profil-counter.h index 1bd5c218ca..53ad09f745 100644 --- a/sysdeps/unix/sysv/linux/ia64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/ia64/profil-counter.h @@ -20,7 +20,7 @@ and the interrupted PC is easily findable in the `struct sigcontext'. */ static void -profil_counter (int signr, siginfo_t *si, struct sigcontext *scp) +__profil_counter (int signr, siginfo_t *si, struct sigcontext *scp) { unsigned long ip = scp->sc_ip & ~0X3ULL, slot = scp->sc_ip & 0x3ull; diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h b/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h index 7f279072b4..31f9a34302 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h @@ -20,7 +20,7 @@ #include <sigcontextinfo.h> static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count((void *) ((unsigned long) GET_PC (scp) & 0x7fffffffUL)); } diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h b/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h index b5d243193d..e3c304c34e 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h @@ -20,7 +20,7 @@ #include <sigcontextinfo.h> static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); } diff --git a/sysdeps/unix/sysv/linux/sh/profil-counter.h b/sysdeps/unix/sysv/linux/sh/profil-counter.h index d7707c0cc8..d1f84413d3 100644 --- a/sysdeps/unix/sysv/linux/sh/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sh/profil-counter.h @@ -19,7 +19,7 @@ #include <signal.h> static void -profil_counter (int signo, int _a2, int _a3, int _a4, struct sigcontext sc) +__profil_counter (int signo, int _a2, int _a3, int _a4, struct sigcontext sc) { void *pc; pc = (void *) sc.sc_pc; diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h index 31b4ddf7ac..b0d9959d90 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h @@ -19,7 +19,10 @@ #include <signal.h> void -profil_counter (int signo, struct sigcontext *si) +__profil_counter (int signo, struct sigcontext *si) { profil_count ((void *) si->si_regs.pc); } +#ifndef __profil_counter +weak_alias (__profil_counter, profil_counter) +#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h index 38f7270ac2..2745a320aa 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h @@ -19,7 +19,10 @@ #include <signal.h> void -profil_counter (int signo, struct sigcontext *si) +__profil_counter (int signo, struct sigcontext *si) { profil_count ((void *) si->sigc_regs.tpc); } +#ifndef __profil_counter +weak_alias (__profil_counter, profil_counter) +#endif diff --git a/sysdeps/unix/sysv/linux/tile/profil-counter.h b/sysdeps/unix/sysv/linux/tile/profil-counter.h index 4ab1666a12..c509403ddd 100644 --- a/sysdeps/unix/sysv/linux/tile/profil-counter.h +++ b/sysdeps/unix/sysv/linux/tile/profil-counter.h @@ -20,7 +20,7 @@ #include <sigcontextinfo.h> static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); } diff --git a/sysdeps/unix/sysv/linux/x86_64/profil-counter.h b/sysdeps/unix/sysv/linux/x86_64/profil-counter.h index 90c5667b53..6f5fd93997 100644 --- a/sysdeps/unix/sysv/linux/x86_64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/x86_64/profil-counter.h @@ -20,7 +20,7 @@ #include <sigcontextinfo.h> static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); |