From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fernando Nasser To: Jim Blandy Cc: Charlie Mills , gdb-patches@sourceware.cygnus.com Subject: Re: Simple but crucial bug fix to gdb Date: Fri, 01 Jun 2001 13:41:00 -0000 Message-id: <3B17FDDB.58BB0638@cygnus.com> References: <3.0.5.32.20010530142745.01470ec0@pophost.pdxuxbre.lmc.com> X-SW-Source: 2001-06/msg00009.html Thank you Jim. Fernando Jim Blandy wrote: > > Charlie Mills writes: > > Bug description: gdb 4.xx and 5.0 crashes while reading our executable. > > Our executable is the result of linking objects compiled by gcc with > > other objects compiled using SPARCworks CC. The stack trace is > > appended at the end of this message. > > I managed to construct an executable that would crash GDB in the same > way yours did (by editing a binary to get stabs of the sort Sun's > compiler produces). I'm committing the patch below, which prevents > the crashes. It's essentially the same fix as yours, except that > there are two cases (static and global functions) that need attention, > not one. > > I'm concerned that your builds are producing debugging entries for > functions that appear to be outside of any compilation unit. GDB > doesn't really know what to do with this; at the moment, it mostly > ignores the function's entry. I wish I could play around with the > situation and figure out what really needs to be done; with the > current fix, I strongly suspect that GDB will be unable to find > debugging information for some functions in some circumstances. So > that the problem doesn't disappear from view entirely, my patch makes > GDB complain (that's a technical term) when it sees debugging info > like that present in your executable. Perhaps we'll find another > case, and we'll be able to really fix the bug. > > In any case, thanks for the bug report. > > 2001-06-01 Jim Blandy > > * partial-stab.h: New complaint: function_outside_compilation_unit. > (case N_FUN: case 'f':, case N_FUN: case 'F':): If pst is zero, > complain, and don't try to set pst's start address. > > Index: gdb/partial-stab.h > =================================================================== > RCS file: /cvs/src/src/gdb/partial-stab.h,v > retrieving revision 1.9 > diff -c -r1.9 partial-stab.h > *** gdb/partial-stab.h 2001/05/31 03:41:31 1.9 > --- gdb/partial-stab.h 2001/06/01 20:24:26 > *************** > *** 40,45 **** > --- 40,48 ---- > > switch (CUR_SYMBOL_TYPE) > { > + static struct complaint function_outside_compilation_unit = { > + "function `%s' appears to be defined outside of all compilation units", 0, 0 > + }; > char *p; > /* > * Standard, external, non-debugger, symbols > *************** > *** 576,581 **** > --- 579,592 ---- > continue; > > case 'f': > + if (! pst) > + { > + int name_len = p - namestring; > + char *name = xmalloc (name_len + 1); > + memcpy (name, namestring, name_len); > + name[name_len] = '\0'; > + complain (&function_outside_compilation_unit, name); > + } > CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); > #ifdef DBXREAD_ONLY > /* Kludges for ELF/STABS with Sun ACC */ > *************** > *** 600,609 **** > the bounds created by N_SO symbols. If that's the case > use the address of this function as the low bound for > the partial symbol table. */ > ! if (textlow_not_set > ! || (pst && CUR_SYMBOL_VALUE < pst->textlow > ! && CUR_SYMBOL_VALUE > ! != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))) > { > pst->textlow = CUR_SYMBOL_VALUE; > textlow_not_set = 0; > --- 611,622 ---- > the bounds created by N_SO symbols. If that's the case > use the address of this function as the low bound for > the partial symbol table. */ > ! if (pst > ! && (textlow_not_set > ! || (CUR_SYMBOL_VALUE < pst->textlow > ! && (CUR_SYMBOL_VALUE > ! != ANOFFSET (objfile->section_offsets, > ! SECT_OFF_TEXT (objfile)))))) > { > pst->textlow = CUR_SYMBOL_VALUE; > textlow_not_set = 0; > *************** > *** 620,625 **** > --- 633,646 ---- > are put into the global psymtab like one would expect. > They're also in the minimal symbol table. */ > case 'F': > + if (! pst) > + { > + int name_len = p - namestring; > + char *name = xmalloc (name_len + 1); > + memcpy (name, namestring, name_len); > + name[name_len] = '\0'; > + complain (&function_outside_compilation_unit, name); > + } > CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); > #ifdef DBXREAD_ONLY > /* Kludges for ELF/STABS with Sun ACC */ > *************** > *** 647,656 **** > the bounds created by N_SO symbols. If that's the case > use the address of this function as the low bound for > the partial symbol table. */ > ! if (textlow_not_set > ! || (pst && CUR_SYMBOL_VALUE < pst->textlow > ! && CUR_SYMBOL_VALUE > ! != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))) > { > pst->textlow = CUR_SYMBOL_VALUE; > textlow_not_set = 0; > --- 668,679 ---- > the bounds created by N_SO symbols. If that's the case > use the address of this function as the low bound for > the partial symbol table. */ > ! if (pst > ! && (textlow_not_set > ! || (CUR_SYMBOL_VALUE < pst->textlow > ! && (CUR_SYMBOL_VALUE > ! != ANOFFSET (objfile->section_offsets, > ! SECT_OFF_TEXT (objfile)))))) > { > pst->textlow = CUR_SYMBOL_VALUE; > textlow_not_set = 0; -- Fernando Nasser Red Hat - Toronto E-Mail: fnasser@redhat.com 2323 Yonge Street, Suite #300 Toronto, Ontario M4P 2C9