diff options
Diffstat (limited to 'gdb/mdebugread.c')
-rw-r--r-- | gdb/mdebugread.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 1bc9eef..c974c9e 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -143,7 +143,8 @@ struct symloc || (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_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 */ @@ -2425,26 +2426,72 @@ parse_partial_symbols (struct objfile *objfile) 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; |