From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25085 invoked by alias); 19 Apr 2002 16:15:30 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 25037 invoked from network); 19 Apr 2002 16:15:24 -0000 Received: from unknown (HELO cygnus.com) (205.180.83.203) by sources.redhat.com with SMTP; 19 Apr 2002 16:15:24 -0000 Received: from localhost.redhat.com (remus.sfbay.redhat.com [172.16.27.252]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id JAA17591; Fri, 19 Apr 2002 09:15:21 -0700 (PDT) Received: by localhost.redhat.com (Postfix, from userid 469) id 755EF11435; Fri, 19 Apr 2002 12:14:59 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15552.17027.348236.908245@localhost.redhat.com> Date: Fri, 19 Apr 2002 09:15:00 -0000 To: Joel Brobecker Cc: Elena Zannoni , gdb-patches@sources.redhat.com Subject: Re: [RFC] Uninitialized section index internal error on Tru64 5.1 In-Reply-To: <20020416193952.A1404@act-europe.fr> References: <20020412121941.E16134@act-europe.fr> <15546.1263.304306.933281@localhost.redhat.com> <20020416193952.A1404@act-europe.fr> X-SW-Source: 2002-04/txt/msg00626.txt.bz2 Joel Brobecker writes: > Thank you Elena for reviewing my changes. May I suggest the following > patch for inclusion, then? Yes, OK. Thanks Elena > > 2002-04-16 J. Brobecker > > * symfile.h (get_section_index): Define. > * symfile.c (get_section_index): New function. > * mdebugread.c (SC_IS_SBSS): New macro. > (SC_IS_BSS): Return true for the scBss storage class only, as > the scSBss storage class refers to the .sbss section. > (parse_partial_symbols): Discard the symbols which associated > section does not exist. > Make sure to use the .sbss section index for symbols which > storage class is scBss, rather than using the .bss section index. > > One additional note: I split the SC_IS_BSS macro into 2 macros, one for > scBss and one for scSBss. I wonder if the same should not be done for > the SC_IS_TEXT and SC_IS_DATA macros as well. So far, I haven't found a > case where this causes a problem, so left them unchanged for now. > > -- > Joel > Index: symfile.h > =================================================================== > RCS file: /cvs/src/src/gdb/symfile.h,v > retrieving revision 1.12 > diff -c -3 -p -r1.12 symfile.h > *** symfile.h 1 Feb 2002 01:14:20 -0000 1.12 > --- symfile.h 16 Apr 2002 13:18:36 -0000 > *************** extern void find_lowest_section (bfd *, > *** 252,257 **** > --- 252,259 ---- > > extern bfd *symfile_bfd_open (char *); > > + extern int get_section_index (struct objfile *, char *); > + > /* Utility functions for overlay sections: */ > extern enum overlay_debugging_state { > ovly_off, > Index: symfile.c > =================================================================== > RCS file: /cvs/src/src/gdb/symfile.c,v > retrieving revision 1.58 > diff -c -3 -p -r1.58 symfile.c > *** symfile.c 29 Mar 2002 01:09:27 -0000 1.58 > --- symfile.c 16 Apr 2002 13:18:36 -0000 > *************** static void cashier_psymtab (struct part > *** 120,125 **** > --- 120,127 ---- > > bfd *symfile_bfd_open (char *); > > + int get_section_index (struct objfile *, char *); > + > static void find_sym_fns (struct objfile *); > > static void decrement_reading_symtab (void *); > *************** symfile_bfd_open (char *name) > *** 1113,1118 **** > --- 1115,1132 ---- > bfd_errmsg (bfd_get_error ())); > } > return (sym_bfd); > + } > + > + /* Return the section index for the given section name. Return -1 if > + the section was not found. */ > + int > + get_section_index (struct objfile *objfile, char *section_name) > + { > + asection *sect = bfd_get_section_by_name (objfile->obfd, section_name); > + if (sect) > + return sect->index; > + else > + return -1; > } > > /* Link a new symtab_fns into the global symtab_fns list. Called on gdb > Index: mdebugread.c > =================================================================== > RCS file: /cvs/src/src/gdb/mdebugread.c,v > retrieving revision 1.24 > diff -c -3 -p -r1.24 mdebugread.c > *** mdebugread.c 19 Mar 2002 19:00:03 -0000 1.24 > --- mdebugread.c 16 Apr 2002 13:18:36 -0000 > *************** struct symloc > *** 143,149 **** > || (sc) == scPData \ > || (sc) == scXData) > #define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon) > ! #define SC_IS_BSS(sc) ((sc) == scBss || (sc) == scSBss) > #define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined) > > /* Various complaints about symbol reading that don't abort the process */ > --- 143,150 ---- > || (sc) == scPData \ > || (sc) == scXData) > #define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon) > ! #define SC_IS_BSS(sc) ((sc) == scBss) > ! #define SC_IS_SBSS(sc) ((sc) == scSBss) > #define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined) > > /* Various complaints about symbol reading that don't abort the process */ > *************** parse_partial_symbols (struct objfile *o > *** 2425,2450 **** > --- 2426,2497 ---- > ms_type = mst_bss; > svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile)); > } > + else if (SC_IS_SBSS (ext_in->asym.sc)) > + { > + ms_type = mst_bss; > + svalue += ANOFFSET (objfile->section_offsets, > + get_section_index (objfile, ".sbss")); > + } > else > ms_type = mst_abs; > break; > case stLabel: > /* Label */ > + > + /* On certain platforms, some extra label symbols can be > + generated by the linker. One possible usage for this kind > + of symbols is to represent the address of the begining of a > + given section. For instance, on Tru64 5.1, the address of > + the _ftext label is the start address of the .text section. > + > + The storage class of these symbols is usually directly > + related to the section to which the symbol refers. For > + instance, on Tru64 5.1, the storage class for the _fdata > + label is scData, refering to the .data section. > + > + It is actually possible that the section associated to the > + storage class of the label does not exist. On True64 5.1 > + for instance, the libm.so shared library does not contain > + any .data section, although it contains a _fpdata label > + which storage class is scData... Since these symbols are > + usually useless for the debugger user anyway, we just > + discard these symbols. > + */ > + > if (SC_IS_TEXT (ext_in->asym.sc)) > { > + if (objfile->sect_index_text == -1) > + continue; > + > ms_type = mst_file_text; > svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); > } > else if (SC_IS_DATA (ext_in->asym.sc)) > { > + if (objfile->sect_index_data == -1) > + continue; > + > ms_type = mst_file_data; > svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile)); > } > else if (SC_IS_BSS (ext_in->asym.sc)) > { > + if (objfile->sect_index_bss == -1) > + continue; > + > ms_type = mst_file_bss; > svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile)); > } > + else if (SC_IS_SBSS (ext_in->asym.sc)) > + { > + const int sbss_sect_index = get_section_index (objfile, ".sbss"); > + > + if (sbss_sect_index == -1) > + continue; > + > + ms_type = mst_file_bss; > + svalue += ANOFFSET (objfile->section_offsets, sbss_sect_index); > + } > else > ms_type = mst_abs; > break;