Fix profil_counter namespace (bug 17725)
diff mbox

Message ID alpine.DEB.2.10.1412171708350.25335@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers Dec. 17, 2014, 5:09 p.m. UTC
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 - from a baseline with
<https://sourceware.org/ml/libc-alpha/2014-12/msg00618.html> applied,
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.

Comments

Roland McGrath Dec. 17, 2014, 6:06 p.m. UTC | #1
OK

Patch
diff mbox

diff --git a/sysdeps/generic/profil-counter.h b/sysdeps/generic/profil-counter.h
index 4ff9b49..52800c8 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 54ace22..7128cb7 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 0e19d16..e2b7a49 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 ddf4d41..908bd6e 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 1561672..85c4712 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 0bd60cb..c414619 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 1bd5c21..53ad09f 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 7f27907..31f9a34 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 b5d2431..e3c304c 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 d7707c0..d1f8441 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 31b4ddf..b0d9959 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 38f7270..2745a32 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 4ab1666..c509403 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 90c5667..6f5fd93 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));