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.
This commit is contained in:
Joseph Myers 2014-12-17 18:10:37 +00:00
parent 8ac5a76a99
commit ea41469b7a
16 changed files with 70 additions and 21 deletions

View File

@ -1,5 +1,45 @@
2014-12-17 Joseph Myers <joseph@codesourcery.com> 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] [BZ #17722]
* inet/inet_mkadr.c (inet_makeaddr): Rename to __inet_makeaddr and * inet/inet_mkadr.c (inet_makeaddr): Rename to __inet_makeaddr and
define as weak alias of __inet_makeaddr. define as weak alias of __inet_makeaddr.

2
NEWS
View File

@ -15,7 +15,7 @@ Version 2.21
17522, 17555, 17570, 17571, 17572, 17573, 17574, 17581, 17582, 17583, 17522, 17555, 17570, 17571, 17572, 17573, 17574, 17581, 17582, 17583,
17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625, 17630, 17633, 17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625, 17630, 17633,
17634, 17647, 17653, 17657, 17664, 17665, 17668, 17682, 17717, 17719, 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 * CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag
under certain input conditions resulting in the execution of a shell for under certain input conditions resulting in the execution of a shell for

View File

@ -20,7 +20,7 @@
and the interrupted PC is easily findable in the `struct sigcontext'. */ and the interrupted PC is easily findable in the `struct sigcontext'. */
static void 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); profil_count ((void *) scp->sc_pc);
} }

View File

@ -48,7 +48,7 @@ profil_count (void *pc)
++samples[i]; ++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 handler for SIGPROF. It calls `profil_count' (above) with the PC of the
interrupted code. */ interrupted code. */
#include "profil-counter.h" #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_offset = offset;
pc_scale = scale; pc_scale = scale;
act.sa_handler = (sighandler_t) &profil_counter; act.sa_handler = (sighandler_t) &__profil_counter;
act.sa_flags = SA_RESTART; act.sa_flags = SA_RESTART;
__sigfillset (&act.sa_mask); __sigfillset (&act.sa_mask);
if (__sigaction (SIGPROF, &act, oact_ptr) < 0) if (__sigaction (SIGPROF, &act, oact_ptr) < 0)

View File

@ -175,17 +175,17 @@ profil_count_uint (void *pcp)
profil_count (pcp, 1); 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 handler for SIGPROF. It calls `profil_count' (above) with the PC of the
interrupted code. */ interrupted code. */
#define profil_counter profil_counter_ushort #define __profil_counter __profil_counter_ushort
#define profil_count(pc) profil_count (pc, 0) #define profil_count(pc) profil_count (pc, 0)
#include <profil-counter.h> #include <profil-counter.h>
#undef profil_counter #undef __profil_counter
#undef profil_count #undef profil_count
#define profil_counter profil_counter_uint #define __profil_counter __profil_counter_uint
#define profil_count(pc) profil_count (pc, 1) #define profil_count(pc) profil_count (pc, 1)
#include <profil-counter.h> #include <profil-counter.h>
@ -334,9 +334,9 @@ __sprofil (struct prof *profp, int profcnt, struct timeval *tvp,
/* Install SIGPROF handler. */ /* Install SIGPROF handler. */
if (flags & PROF_UINT) if (flags & PROF_UINT)
act.sa_handler = (sighandler_t) &profil_counter_uint; act.sa_handler = (sighandler_t) &__profil_counter_uint;
else else
act.sa_handler = (sighandler_t) &profil_counter_ushort; act.sa_handler = (sighandler_t) &__profil_counter_ushort;
act.sa_flags = SA_RESTART; act.sa_flags = SA_RESTART;
__sigfillset (&act.sa_mask); __sigfillset (&act.sa_mask);
if (__sigaction (SIGPROF, &act, &prof_info.saved_action) < 0) if (__sigaction (SIGPROF, &act, &prof_info.saved_action) < 0)

View File

@ -20,7 +20,7 @@
#include <sigcontextinfo.h> #include <sigcontextinfo.h>
void void
profil_counter (int signo, const SIGCONTEXT scp) __profil_counter (int signo, const SIGCONTEXT scp)
{ {
profil_count ((void *) GET_PC (scp)); profil_count ((void *) GET_PC (scp));
@ -29,3 +29,6 @@ profil_counter (int signo, const SIGCONTEXT scp)
the signal context. */ the signal context. */
asm volatile (""); asm volatile ("");
} }
#ifndef __profil_counter
weak_alias (__profil_counter, profil_counter)
#endif

View File

@ -17,7 +17,7 @@
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
static void 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; unsigned long ip = uctx->uc_mcontext.sc_iaoq[0] & ~0x3;
profil_count ((void *) ip); profil_count ((void *) ip);

View File

@ -20,7 +20,7 @@
#include <sigcontextinfo.h> #include <sigcontextinfo.h>
static void static void
profil_counter (int signo, const SIGCONTEXT scp) __profil_counter (int signo, const SIGCONTEXT scp)
{ {
profil_count ((void *) GET_PC (scp)); profil_count ((void *) GET_PC (scp));

View File

@ -20,7 +20,7 @@
and the interrupted PC is easily findable in the `struct sigcontext'. */ and the interrupted PC is easily findable in the `struct sigcontext'. */
static void 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; unsigned long ip = scp->sc_ip & ~0X3ULL, slot = scp->sc_ip & 0x3ull;

View File

@ -20,7 +20,7 @@
#include <sigcontextinfo.h> #include <sigcontextinfo.h>
static void static void
profil_counter (int signo, SIGCONTEXT scp) __profil_counter (int signo, SIGCONTEXT scp)
{ {
profil_count((void *) ((unsigned long) GET_PC (scp) & 0x7fffffffUL)); profil_count((void *) ((unsigned long) GET_PC (scp) & 0x7fffffffUL));
} }

View File

@ -20,7 +20,7 @@
#include <sigcontextinfo.h> #include <sigcontextinfo.h>
static void static void
profil_counter (int signo, SIGCONTEXT scp) __profil_counter (int signo, SIGCONTEXT scp)
{ {
profil_count ((void *) GET_PC (scp)); profil_count ((void *) GET_PC (scp));
} }

View File

@ -19,7 +19,7 @@
#include <signal.h> #include <signal.h>
static void 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; void *pc;
pc = (void *) sc.sc_pc; pc = (void *) sc.sc_pc;

View File

@ -19,7 +19,10 @@
#include <signal.h> #include <signal.h>
void void
profil_counter (int signo, struct sigcontext *si) __profil_counter (int signo, struct sigcontext *si)
{ {
profil_count ((void *) si->si_regs.pc); profil_count ((void *) si->si_regs.pc);
} }
#ifndef __profil_counter
weak_alias (__profil_counter, profil_counter)
#endif

View File

@ -19,7 +19,10 @@
#include <signal.h> #include <signal.h>
void void
profil_counter (int signo, struct sigcontext *si) __profil_counter (int signo, struct sigcontext *si)
{ {
profil_count ((void *) si->sigc_regs.tpc); profil_count ((void *) si->sigc_regs.tpc);
} }
#ifndef __profil_counter
weak_alias (__profil_counter, profil_counter)
#endif

View File

@ -20,7 +20,7 @@
#include <sigcontextinfo.h> #include <sigcontextinfo.h>
static void static void
profil_counter (int signo, SIGCONTEXT scp) __profil_counter (int signo, SIGCONTEXT scp)
{ {
profil_count ((void *) GET_PC (scp)); profil_count ((void *) GET_PC (scp));
} }

View File

@ -20,7 +20,7 @@
#include <sigcontextinfo.h> #include <sigcontextinfo.h>
static void static void
profil_counter (int signo, SIGCONTEXT scp) __profil_counter (int signo, SIGCONTEXT scp)
{ {
profil_count ((void *) GET_PC (scp)); profil_count ((void *) GET_PC (scp));