diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/dwarfread.c | 22 | ||||
-rw-r--r-- | gdb/elfread.c | 49 |
3 files changed, 72 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6d3af49..ce20df8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index 709b958..3b9b225 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -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, diff --git a/gdb/elfread.c b/gdb/elfread.c index fbe9bc5..af625fe 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -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. */ } |