mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-29 00:01:12 +00:00
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:
parent
8ac5a76a99
commit
ea41469b7a
40
ChangeLog
40
ChangeLog
@ -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
2
NEWS
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user