aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Fish <fnf@specifix.com>1991-11-15 03:36:45 +0000
committerFred Fish <fnf@specifix.com>1991-11-15 03:36:45 +0000
commita7446af61b18b09f1b217838a1f22d152975c009 (patch)
tree9efa013d65f23d5ff974e8c15ec4d08d62d6fa0d
parent811b9ab2186dc1d89d64400602d163ca0eef11f1 (diff)
downloadgdb-a7446af61b18b09f1b217838a1f22d152975c009.zip
gdb-a7446af61b18b09f1b217838a1f22d152975c009.tar.gz
gdb-a7446af61b18b09f1b217838a1f22d152975c009.tar.bz2
Changes to build misc function vector entries from canonical bfd symbol
table entries.
-rw-r--r--gdb/ChangeLog19
-rw-r--r--gdb/dwarfread.c26
-rw-r--r--gdb/elfread.c93
3 files changed, 121 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a80c8e2..0496791 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 0201945..bfdddc5 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 49b5d34..d203e2e 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