From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4346 invoked by alias); 17 Oct 2004 00:39:59 -0000 Mailing-List: contact glibc-bugs-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Post: List-Help: , Sender: glibc-bugs-owner@sources.redhat.com Received: (qmail 4337 invoked by uid 48); 17 Oct 2004 00:39:58 -0000 Date: Sun, 17 Oct 2004 00:39:00 -0000 From: "andy dot andystewart at gmail dot com" To: glibc-bugs@sources.redhat.com Message-ID: <20041017003957.455.andy.andystewart@gmail.com> Reply-To: sourceware-bugzilla@sources.redhat.com Subject: [Bug libc/455] New: ARM profiling fault X-Bugzilla-Reason: CC X-SW-Source: 2004-10/txt/msg00077.txt.bz2 List-Id: 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.