View Bug Activity | Format For Printing
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;
The gmon.c change is no longer necessary in CVS, but I'm not sure about the changes to the two ELF profilers; they probably still are.
I was wrong. The ELF profiler uses __attribute__((packed)) so this problem does not occur. Combined with Randolph's fix for gmon, there's nothing left of this bug.