From a7446af61b18b09f1b217838a1f22d152975c009 Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Fri, 15 Nov 1991 03:36:45 +0000 Subject: [PATCH] Changes to build misc function vector entries from canonical bfd symbol table entries. --- gdb/ChangeLog | 19 ++++++++++ gdb/dwarfread.c | 26 ++++++-------- gdb/elfread.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 121 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a80c8e2943..0496791611 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +Thu Nov 14 19:27:30 1991 Fred Fish (fnf at cygnus.com) + + * dwarfread.c: Add misc function type parameter to internal + record_misc_function(). Remove calls to init_misc_bunches() + and condense_misc_bunches(), these are now done in elfread.c. + + * elfread.c: Add support for reading bfd canonical symbol tables + and generating misc function vector entries for global and + absolute symbols. Do calls to init_misc_bunches() and + condense_misc_bunches() where they will enclose all calls to + record_misc_function(), including those in dwarfread.c. + +Thu Nov 14 17:02:11 1991 Roland H. Pesch (pesch at cygnus.com) + + * doc/Makefile.in: new targets gdb.me, gdb.ms, gdb.mm + (roffable documentation). + * doc/gdb.texinfo: embedded hints (as comments) for better + texi2roff conversion. + Thu Nov 14 13:18:25 1991 John Gilmore (gnu at cygnus.com) * m88k-tdep.c (examine_prologue): Deal with OR instructions diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index 0201945afc..bfdddc554b 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -448,7 +448,8 @@ static int EXFUN(locval, (char *loc)); static void -EXFUN(record_misc_function, (char *name AND CORE_ADDR address)); +EXFUN(record_misc_function, (char *name AND CORE_ADDR address AND + enum misc_function_type)); static int EXFUN(compare_psymbols, @@ -522,9 +523,6 @@ DEFUN(dwarf_build_psymtabs, init_psymbol_list (1024); } - init_misc_bunches (); - make_cleanup (discard_misc_bunches, 0); - /* Follow the compilation unit sibling chain, building a partial symbol table entry for each one. Save enough information about each compilation unit to locate the full DWARF information later. */ @@ -532,10 +530,6 @@ DEFUN(dwarf_build_psymtabs, scan_compilation_units (filename, addr, dbbase, dbbase + dbsize, dbfoff, lnoffset, objfile); - /* Go over the miscellaneous functions and install them in the miscellaneous - function vector. */ - - condense_misc_bunches (!mainline); do_cleanups (back_to); } @@ -548,7 +542,8 @@ LOCAL FUNCTION SYNOPSIS - static void record_misc_function (char *name, CORE_ADDR address) + static void record_misc_function (char *name, CORE_ADDR address, + enum misc_function_type mf_type) DESCRIPTION @@ -557,17 +552,14 @@ DESCRIPTION symbol, records this information for later use in building the miscellaneous function vector. -NOTES - - FIXME: For now we just use mf_text as the type. This should be - fixed. */ static void -DEFUN(record_misc_function, (name, address), char *name AND CORE_ADDR address) +DEFUN(record_misc_function, (name, address, mf_type), + char *name AND CORE_ADDR address AND enum misc_function_type mf_type) { prim_record_misc_function (obsavestring (name, strlen (name)), address, - mf_text); + mf_type); } /* @@ -2615,11 +2607,13 @@ DEFUN(add_partial_symbol, (dip), struct dieinfo *dip) switch (dip -> dietag) { case TAG_global_subroutine: - record_misc_function (dip -> at_name, dip -> at_low_pc); + record_misc_function (dip -> at_name, dip -> at_low_pc, mf_text); add_psymbol_to_list (&global_psymbols, dip -> at_name, VAR_NAMESPACE, LOC_BLOCK, dip -> at_low_pc); break; case TAG_global_variable: + record_misc_function (dip -> at_name, locval (dip -> at_location), + mf_data); add_psymbol_to_list (&global_psymbols, dip -> at_name, VAR_NAMESPACE, LOC_STATIC, 0); break; diff --git a/gdb/elfread.c b/gdb/elfread.c index 49b5d3415f..d203e2e9b5 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -94,6 +94,71 @@ DEFUN(elf_locate_sections, (abfd, sectp, ei), } } +/* + +LOCAL FUNCTION + + record_misc_function -- add entry to miscellaneous function vector + +SYNOPSIS + + static void record_misc_function (char *name, CORE_ADDR address) + +DESCRIPTION + + Given a pointer to the name of a symbol that should be added to the + miscellaneous function vector, and the address associated with that + symbol, records this information for later use in building the + miscellaneous function vector. + +NOTES + + FIXME: For now we just use mf_unknown as the type. This should be + fixed. + */ + +static void +DEFUN(record_misc_function, (name, address), char *name AND CORE_ADDR address) +{ + prim_record_misc_function (obsavestring (name, strlen (name)), address, + mf_unknown); +} + +static void +DEFUN (elf_symtab_read, (abfd, addr), + bfd *abfd AND + CORE_ADDR addr) +{ + unsigned int storage_needed; + asymbol *sym; + asymbol **symbol_table; + unsigned int number_of_symbols; + unsigned int i; + struct cleanup *back_to; + + storage_needed = get_symtab_upper_bound (abfd); + + if (storage_needed > 0) + { + symbol_table = (asymbol **) bfd_xmalloc (storage_needed); + back_to = make_cleanup (free, symbol_table); + number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table); + + for (i = 0; i < number_of_symbols; i++) + { + sym = *symbol_table++; + /* Select global symbols that are defined in a specific section + or are absolute. */ + if (sym -> flags & BSF_GLOBAL + && ((sym -> section != NULL) || (sym -> flags & BSF_ABSOLUTE))) + { + record_misc_function ((char *) sym -> name, sym -> value); + } + } + do_cleanups (back_to); + } +} + /* Scan and build partial symbols for a symbol file. We have been initialized by a call to elf_symfile_init, which currently does nothing. @@ -111,7 +176,14 @@ DEFUN(elf_locate_sections, (abfd, sectp, ei), file, the corresponding partial symbol table is mutated into a full fledged symbol table by going back and reading the symbols for real. The function dwarf_psymtab_to_symtab() is the function that - does this for DWARF symbols. */ + does this for DWARF symbols. + + Note that ELF files have a "minimal" symbol table, which looks a lot + like a COFF symbol table, but has only the minimal information necessary + for linking. We process this also, and just use the information to + add to the misc function vector. This gives us some minimal debugging + capability even for files compiled without -g. + */ static void DEFUN(elf_symfile_read, (sf, addr, mainline), @@ -121,7 +193,19 @@ DEFUN(elf_symfile_read, (sf, addr, mainline), { bfd *abfd = sf->objfile->obfd; struct elfinfo ei; + struct cleanup *back_to; + init_misc_bunches (); + back_to = make_cleanup (discard_misc_bunches, 0); + + /* Process the normal ELF symbol table first. */ + + elf_symtab_read (abfd, addr); + + /* Now process the DWARF debugging information, which is contained in + special ELF sections. We first have to find them... */ + + (void) memset ((char *) &ei, 0, sizeof (ei)); bfd_map_over_sections (abfd, elf_locate_sections, &ei); if (ei.dboffset && ei.lnoffset) { @@ -132,12 +216,19 @@ DEFUN(elf_symfile_read, (sf, addr, mainline), ei.dboffset, ei.dbsize, ei.lnoffset, ei.lnsize, sf->objfile); } + if (!partial_symtab_list) { wrap_here (""); printf_filtered ("(no debugging symbols found)..."); wrap_here (""); } + + /* Go over the miscellaneous functions and install them in the + miscellaneous function vector. */ + + condense_misc_bunches (!mainline); + do_cleanups (back_to); } /* Initialize anything that needs initializing when a completely new symbol -- 2.34.1