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;