+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.
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.
{
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,
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,
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. */
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. */
}