]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix profil_counter namespace (bug 17725).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 17 Dec 2014 18:10:37 +0000 (18:10 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 17 Dec 2014 18:10:37 +0000 (18:10 +0000)
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.

16 files changed:
ChangeLog
NEWS
sysdeps/generic/profil-counter.h
sysdeps/posix/profil.c
sysdeps/posix/sprofil.c
sysdeps/unix/sysv/linux/arm/profil-counter.h
sysdeps/unix/sysv/linux/hppa/profil-counter.h
sysdeps/unix/sysv/linux/i386/profil-counter.h
sysdeps/unix/sysv/linux/ia64/profil-counter.h
sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h
sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h
sysdeps/unix/sysv/linux/sh/profil-counter.h
sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h
sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h
sysdeps/unix/sysv/linux/tile/profil-counter.h
sysdeps/unix/sysv/linux/x86_64/profil-counter.h

index 2fc8cde873310f4c03728e1cc43d134ad6111780..7bfd1c9eb0b5dd310577081f4b1cb3ccdc814868 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,45 @@
 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.
+
        [BZ #17722]
        * inet/inet_mkadr.c (inet_makeaddr): Rename to __inet_makeaddr and
        define as weak alias of __inet_makeaddr.
diff --git a/NEWS b/NEWS
index d4ccd37dfa3194a6c069c3d8412c74db08af5d04..05b398ecd664ab29f1a86963adb0c6c8c3830ab1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,7 +15,7 @@ Version 2.21
   17522, 17555, 17570, 17571, 17572, 17573, 17574, 17581, 17582, 17583,
   17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625, 17630, 17633,
   17634, 17647, 17653, 17657, 17664, 17665, 17668, 17682, 17717, 17719,
-  17722.
+  17722, 17725.
 
 * CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag
   under certain input conditions resulting in the execution of a shell for
index 4ff9b496cfe1ee7bae95120356a4e7e9aeb3bb42..52800c8ad1a9169700d828a732f674e9f31dd215 100644 (file)
@@ -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);
 }
index 54ace22537997da840fa13dd9447e19ac5daf979..7128cb7a8b06a5affee6a21ca8284795b06c95ed 100644 (file)
@@ -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)
index 0e19d16c238aa8cc8568cdc025326cbe3ab65c4d..e2b7a4922b40d64f2decfd6eb5cf744e714ec645 100644 (file)
@@ -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)
index ddf4d41af2bc1f5926436bc9e44ad816a764bceb..908bd6e05c8e5da269bd55a0f3f9a41fd0fcbdc5 100644 (file)
@@ -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
index 1561672d947aec5fdbfc5dd97ba3382bc959b3ee..85c4712391c80166c7c0a4f128fbc11fb1f961c5 100644 (file)
@@ -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);
index 0bd60cbce212781884226d2b92e9a129c939ec2b..c4146196301d6f7535cfba53da94d93f28ecf34e 100644 (file)
@@ -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));
 
index 1bd5c218ca74f4f428d8224a5e9f806041ddb7c7..53ad09f7453fd7eb013e90bd7eabc0dab8f3b3d7 100644 (file)
@@ -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;
 
index 7f279072b426502ff42ea8e630f829303c81c3fc..31f9a34302ea62da926dd88b9f4bb40023ca69fd 100644 (file)
@@ -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));
 }
index b5d243193de329a66d58d8dc38a7a7499f25df07..e3c304c34ea077224ea59487765bd45314d8aeaf 100644 (file)
@@ -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));
 }
index d7707c0cc85c8af844b8048f49f045f1ad70bdb2..d1f84413d373c51e085033c8b3966a9ed36546eb 100644 (file)
@@ -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;
index 31b4ddf7ac2d47e98707b4718262f19025d92400..b0d9959d90e25bf86fb0ac41bbcc2993793cda6e 100644 (file)
 #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
index 38f7270ac28ad1b6658599c1b0f78ae0822549af..2745a320aa5fed150647ca8e16947a9b0da77483 100644 (file)
 #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
index 4ab1666a12f526101ccfafba3449290cfac810f5..c509403ddd7652b83580798a42bc280409fdadd2 100644 (file)
@@ -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));
 }
index 90c5667b5381d14236d2f3bda5156d0eaa9a2c79..6f5fd93997050c9fabda959e6dbfaf492315878b 100644 (file)
@@ -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));