* elfread.c (elf_symtab_read): Properly sort out the bss symbols

from the data symbols and give them the correct minimal_symbol_type.
	Add file static symbols to the minimal symbol table, not just
	global symbols.  Ignore symbols that are section names and file names.
	* dwarfread.c (add_partial_symbol):  Add comment about limitations
	of DWARF symbols for distinquishing data from bss when adding
	minimal symbols.  Add file local symbols to minimal symbols.
This commit is contained in:
Fred Fish 1993-08-07 20:27:19 +00:00
parent d8ab5dbf82
commit 379dd96582
3 changed files with 72 additions and 9 deletions

View File

@ -1,3 +1,13 @@
Sat Aug 7 10:59:03 1993 Fred Fish (fnf@deneb.cygnus.com)
* elfread.c (elf_symtab_read): Properly sort out the bss symbols
from the data symbols and give them the correct minimal_symbol_type.
Add file static symbols to the minimal symbol table, not just
global symbols. Ignore symbols that are section names and file names.
* dwarfread.c (add_partial_symbol): Add comment about limitations
of DWARF symbols for distinquishing data from bss when adding
minimal symbols. Add file local symbols to minimal symbols.
Thu Aug 5 08:58:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* ser-go32.c: Define job_control variable.

View File

@ -2614,6 +2614,20 @@ DESCRIPTION
add to a partial symbol table, finish filling in the die info
and then add a partial symbol table entry for it.
Also record the symbol in the minimal symbol table. Note that
DWARF does not directly distinquish between data and bss symbols,
so we use mst_data/mst_file_data for both of them. One way we
could make the distinction is checking the address of the symbol
and then checking the flags on the ELF section that contains
that address to look for SHT_PROGBITS (data) or SHT_NOBITS (bss),
but it probably isn't worth the effort. A side effect of leaving
things as they are is that the minimal symbol created from the DWARF
info, containing the wrong minimal_symbol_type, overrides the minimal
symbol created from processing the canonical bfd symbols, which
did have the right minimal_symbol_type. This is probably a side
effect of the way the table is sorted and duplicates are discarded.
(FIXME?)
NOTES
The caller must ensure that the DIE has a valid name attribute.
@ -2628,7 +2642,7 @@ add_partial_symbol (dip, objfile)
{
case TAG_global_subroutine:
record_minimal_symbol (dip -> at_name, dip -> at_low_pc, mst_text,
objfile);
objfile);
ADD_PSYMBOL_TO_LIST (dip -> at_name, strlen (dip -> at_name),
VAR_NAMESPACE, LOC_BLOCK,
objfile -> global_psymbols,
@ -2636,19 +2650,23 @@ add_partial_symbol (dip, objfile)
break;
case TAG_global_variable:
record_minimal_symbol (dip -> at_name, locval (dip -> at_location),
mst_data, objfile);
mst_data, objfile);
ADD_PSYMBOL_TO_LIST (dip -> at_name, strlen (dip -> at_name),
VAR_NAMESPACE, LOC_STATIC,
objfile -> global_psymbols,
0, cu_language, objfile);
break;
case TAG_subroutine:
record_minimal_symbol (dip -> at_name, dip -> at_low_pc, mst_file_text,
objfile);
ADD_PSYMBOL_TO_LIST (dip -> at_name, strlen (dip -> at_name),
VAR_NAMESPACE, LOC_BLOCK,
objfile -> static_psymbols,
dip -> at_low_pc, cu_language, objfile);
break;
case TAG_local_variable:
record_minimal_symbol (dip -> at_name, locval (dip -> at_location),
mst_file_data, objfile);
ADD_PSYMBOL_TO_LIST (dip -> at_name, strlen (dip -> at_name),
VAR_NAMESPACE, LOC_STATIC,
objfile -> static_psymbols,

View File

@ -235,10 +235,17 @@ elf_symtab_read (abfd, addr, objfile)
for (i = 0; i < number_of_symbols; i++)
{
sym = symbol_table[i];
/* Select global/weak symbols that are defined in a specific section.
Note that bfd now puts abs symbols in their own section, so
all symbols we are interested in will have a section. */
if ((sym -> flags & (BSF_GLOBAL | BSF_WEAK))
/* Bfd flags ELF symbol table STT_SECTION and STT_FILE symbols with
BSF_DEBUGGING. We don't want these in the minimal symbols, so
skip over them. */
if (sym -> flags & BSF_DEBUGGING)
{
continue;
}
/* Select global/local/weak symbols that are defined in a specific
section. Note that bfd puts abs symbols in their own section,
so all symbols we are interested in will have a section. */
if ((sym -> flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
&& (sym -> section != NULL))
{
/* Bfd symbols are section relative. */
@ -252,18 +259,46 @@ elf_symtab_read (abfd, addr, objfile)
no way of figuring this out for absolute symbols. */
if (sym -> section -> flags & SEC_CODE)
{
ms_type = mst_text;
if (sym -> flags & BSF_GLOBAL)
{
ms_type = mst_text;
}
else
{
ms_type = mst_file_text;
}
}
else if (sym -> section -> flags & SEC_DATA)
{
ms_type = mst_data;
if (sym -> flags & BSF_GLOBAL)
{
if (sym -> section -> flags & SEC_HAS_CONTENTS)
{
ms_type = mst_data;
}
else
{
ms_type = mst_bss;
}
}
else
{
if (sym -> section -> flags & SEC_HAS_CONTENTS)
{
ms_type = mst_file_data;
}
else
{
ms_type = mst_file_bss;
}
}
}
else
{
/* FIXME: Solaris2 shared libraries include lots of
odd "absolute" and "undefined" symbols, that play
hob with actions like finding what function the PC
is in. Ignore them if they aren't text or data. */
is in. Ignore them if they aren't text, data, or bss. */
/* ms_type = mst_unknown; */
continue; /* Skip this symbol. */
}