* 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.
This commit is contained in:
Joel Brobecker 2002-04-22 10:19:35 +00:00
parent e2f6d8e5e4
commit 0e931cf0ee
2 changed files with 62 additions and 1 deletions

View File

@ -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;

View File

@ -120,6 +120,8 @@ static void cashier_psymtab (struct partial_symtab *);
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 *);
@ -1115,6 +1117,18 @@ symfile_bfd_open (char *name)
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
startup by the _initialize routine in each object file format reader,
to register information about each format the the reader is prepared