This is the mail archive of the
glibc-bugs@sources.redhat.com
mailing list for the glibc project.
[Bug libc/455] New: ARM profiling fault
- From: "andy dot andystewart at gmail dot com" <sourceware-bugzilla at sources dot redhat dot com>
- To: glibc-bugs at sources dot redhat dot com
- Date: 17 Oct 2004 00:39:58 -0000
- Subject: [Bug libc/455] New: ARM profiling fault
- Reply-to: sourceware-bugzilla at sources dot redhat dot com
A segmentation fault occurs when using the -pg profiling options of gcc for ARM targets.
The problem is due to how a buffer is allocated for profiling samples. One allocation is made for
multiple buffers, and the second buffer is not aligned on a 4 byte boundary. When _mcount is
subsequently called, an invalid index is read from the unaligned buffer, and _mcount attempts to store
the profiling data at an invalid address.
Please include the following patches to gmon/gmon.c, elf/dl-profile.c, and elf/sprof.c in the glibc
component:
--- glibc-2.3.2/gmon/gmon.c 2004-09-25 10:16:24.000000000 -0700
+++ mod_gmon.c 2004-09-25 10:09:40.000000000 -0700
@@ -113,7 +113,7 @@
p->lowpc = ROUNDDOWN(lowpc, HISTFRACTION * sizeof(HISTCOUNTER));
p->highpc = ROUNDUP(highpc, HISTFRACTION * sizeof(HISTCOUNTER));
p->textsize = p->highpc - p->lowpc;
- p->kcountsize = p->textsize / HISTFRACTION;
+ p->kcountsize = ((p->textsize / HISTFRACTION) + 3) & ~3;
p->hashfraction = HASHFRACTION;
p->log_hashfraction = -1;
/* The following test must be kept in sync with the corresponding
--- glibc-2.3.2/elf/dl-profile.c 2004-09-25 11:35:11.000000000 -0700
+++ mod-dl-profile.c 2004-09-25 11:39:40.000000000 -0700
@@ -238,7 +238,7 @@
}
else
log_hashfraction = -1;
- tossize = textsize / HASHFRACTION;
+ tossize = ((textsize / HASHFRACTION) + 3) & ~3;
fromlimit = textsize * ARCDENSITY / 100;
if (fromlimit < MINARCS)
fromlimit = MINARCS;
--- glibc-2.3.2/elf/sprof.c 2004-09-25 11:52:41.000000000 -0700
+++ mod-sprof.c 2004-09-25 11:39:06.000000000 -0700
@@ -452,7 +452,7 @@
printf ("hashfraction = %d\ndivider = %Zu\n",
result->hashfraction,
result->hashfraction * sizeof (struct here_fromstruct));
- result->tossize = textsize / HASHFRACTION;
+ result->tossize = ((textsize / HASHFRACTION) + 3) & ~3;
result->fromlimit = textsize * ARCDENSITY / 100;
if (result->fromlimit < MINARCS)
result->fromlimit = MINARCS;
--
Summary: ARM profiling fault
Product: glibc
Version: 2.3.2
Status: NEW
Severity: critical
Priority: P1
Component: libc
AssignedTo: gotom at debian dot or dot jp
ReportedBy: andy dot andystewart at gmail dot com
CC: glibc-bugs at sources dot redhat dot com
GCC build triplet: Red Hat i386 Linux
GCC host triplet: ARM Linux
GCC target triplet: ARM Linux
http://sources.redhat.com/bugzilla/show_bug.cgi?id=455
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.