mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-25 19:14:52 +08:00
* elfread.c (record_minimal_symbol_and_info): Kludged to put
extra info in the minimal symbol. (elf_symtab_read): The extra info is the size of an ELF object, which was kludged to us in the `udata' field of the BFD symbol. Gag me with a crowbar... (elf_symfile_read): Keep track of both the absolute load address, and the offset between load addr and symbols. Handle STABS as well as DWARF sections, passing the absolute load address to elfstab_build_psymtabs. * objfiles.c (free_objfile): Eliminate storage leaks. Contributed by <Peter.Schauer@regent.e-technik.tu-muenchen.dbp.de>. * symfile.c (symfile_bfd_open): Comment where name is freed. * symmisc.c (extend_psymbol_list): Comment where list is freed.
This commit is contained in:
parent
9342ecb944
commit
346168a2c6
@ -1,5 +1,58 @@
|
||||
Fri Jun 12 18:54:40 1992 John Gilmore (gnu at cygnus.com)
|
||||
|
||||
* arm-pinsn.c, i960-pinsn.c, m68k-pinsn.c, mips-pinsn.c,
|
||||
ns32k-pinsn.c, pyr-pinsn.c, sparc-pinsn.c, tahoe-pinsn.c,
|
||||
vax-pinsn.c: Remove reg_names decl (now in defs.h).
|
||||
|
||||
Solaris-2 support on SPARC:
|
||||
|
||||
* dbxread.c: Add symbol_size to struct dbx_symfile_info.
|
||||
Add symbol_size and file offsets to struct symloc.
|
||||
Add static symbol_table_offset, string_table_offset,
|
||||
file_string_table_offset, next_file_string_table_offset,
|
||||
last_function_name.
|
||||
(add_old_header_file): Convert error() to complain()t.
|
||||
(dbx_symfile_read): Get symbol size via the objfile.
|
||||
Also get symbol_table_offset.
|
||||
(dbx_symfile_init): Record symbol size and count via the objfile.
|
||||
(dbx_next_symbol_text): Always add file_string_table_offset when
|
||||
accessing string table.
|
||||
(read_dbx_symtab): Initialize file_string_table_offset to 0.
|
||||
(SET_NAMESTRING): Use the offset.
|
||||
(end_psymtab): Large kludge to determine addresses where source
|
||||
files start and end (for the psymtab header).
|
||||
(psymtab_to_symtab_1): Set file_string_table_offset before reading.
|
||||
Get this, symbol size, and symbol offset, from psymtab.
|
||||
(read_ofile_symtab): Don't back up one symbol for Solaris2.
|
||||
Patch up last_source_start_addr if zero in N_SO.
|
||||
(process_one_symbol): Add variable function_start_offset.
|
||||
( "", N_FUN, N_LBRAC, N_RBRAC, N_SLINE): Add ifdef for
|
||||
BLOCK_ADDRESS_FUNCTION_RELATIVE.
|
||||
( "", N_OBJ, N_OPT): Ignore.
|
||||
(elfstab_build_psymtabs): New function to read stabs out of
|
||||
an ELF file.
|
||||
|
||||
* Makefile.in: Accept $(BISON) even though we really want $(YACC).
|
||||
(gdb): use GLOBAL_CFLAGS when linking, too.
|
||||
* partial-stab.h (N_UNDF): Deal with Sol2 relative stringtab offsets.
|
||||
(N_OBJ, N_OPT): Ignore.
|
||||
('f', 'F'): Save last function name.
|
||||
|
||||
* elfread.c (record_minimal_symbol_and_info): Kludged to put
|
||||
extra info in the minimal symbol.
|
||||
(elf_symtab_read): The extra info is the size of an ELF object,
|
||||
which was kludged to us in the `udata' field of the BFD symbol.
|
||||
Gag me with a crowbar...
|
||||
(elf_symfile_read): Keep track of both the absolute load address,
|
||||
and the offset between load addr and symbols. Handle STABS as
|
||||
well as DWARF sections, passing the absolute load address to
|
||||
elfstab_build_psymtabs.
|
||||
|
||||
* symfile.h: Prototype elfstab_build_psymtabs.
|
||||
* symfile.c: Add almost-OK debug versions of add_psymbol_*to_list.
|
||||
|
||||
* xm-sysv4.h: Add <limits.h> to avoid conflicting defns in defs.h.
|
||||
|
||||
* buildsym.h: Add processing_acc_compilation flag.
|
||||
* buildsym.c (read_sun_builtin_type, read_sun_floating_type): New.
|
||||
(define_symbol): Skip arg types in function entries. Resolve
|
||||
@ -15,6 +68,11 @@ Fri Jun 12 18:54:40 1992 John Gilmore (gnu at cygnus.com)
|
||||
* configure.in: Solaris config is sparc-sun-solaris2.
|
||||
* config/sun4os5.m[ht]: Rename to config/sun4sol2.m[ht]; new xm, tm.
|
||||
|
||||
* objfiles.c (free_objfile): Eliminate storage leaks. Contributed
|
||||
by <Peter.Schauer@regent.e-technik.tu-muenchen.dbp.de>.
|
||||
* symfile.c (symfile_bfd_open): Comment where name is freed.
|
||||
* symmisc.c (extend_psymbol_list): Comment where list is freed.
|
||||
|
||||
Fri Jun 12 12:49:43 1992 Fred Fish (fnf@cygnus.com)
|
||||
|
||||
* expprint.c (print_subexp): Add missing ']'.
|
||||
|
@ -49,6 +49,8 @@ struct elfinfo {
|
||||
unsigned int dbsize; /* Size of dwarf debug section */
|
||||
unsigned int lnoffset; /* Offset to dwarf line number section */
|
||||
unsigned int lnsize; /* Size of dwarf line number section */
|
||||
asection *stabsect; /* Section pointer for .stab section */
|
||||
asection *stabindexsect; /* Section pointer for .stab.index section */
|
||||
};
|
||||
|
||||
static void
|
||||
@ -84,6 +86,9 @@ elf_locate_sections PARAMS ((bfd *, asection *, PTR));
|
||||
knowledge of DWARF (by design, so any debugging format can be
|
||||
used).
|
||||
|
||||
We also recognize the ".stab" sections used by the Sun compilers
|
||||
released with Solaris 2.
|
||||
|
||||
FIXME: The section names should not be hardwired strings. */
|
||||
|
||||
static void
|
||||
@ -105,6 +110,14 @@ elf_locate_sections (ignore_abfd, sectp, eip)
|
||||
ei -> lnoffset = sectp -> filepos;
|
||||
ei -> lnsize = bfd_get_section_size_before_reloc (sectp);
|
||||
}
|
||||
else if (STREQ (sectp -> name, ".stab"))
|
||||
{
|
||||
ei -> stabsect = sectp;
|
||||
}
|
||||
else if (STREQ (sectp -> name, ".stab.index"))
|
||||
{
|
||||
ei -> stabindexsect = sectp;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* Currently unused */
|
||||
@ -166,6 +179,18 @@ record_minimal_symbol (name, address, ms_type, objfile)
|
||||
prim_record_minimal_symbol (name, address, ms_type);
|
||||
}
|
||||
|
||||
static void
|
||||
record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
|
||||
char *name;
|
||||
CORE_ADDR address;
|
||||
enum minimal_symbol_type ms_type;
|
||||
char *info; /* FIXME, is this really char *? */
|
||||
struct objfile *objfile;
|
||||
{
|
||||
name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
|
||||
prim_record_minimal_symbol_and_info (name, address, ms_type, info);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
LOCAL FUNCTION
|
||||
@ -239,7 +264,9 @@ elf_symtab_read (abfd, addr, objfile)
|
||||
{
|
||||
ms_type = mst_unknown;
|
||||
}
|
||||
record_minimal_symbol ((char *) sym -> name, symaddr, ms_type, objfile);
|
||||
/* Pass symbol size field in via BFD. FIXME!!! */
|
||||
record_minimal_symbol_and_info ((char *) sym -> name,
|
||||
symaddr, ms_type, sym->udata, objfile);
|
||||
}
|
||||
}
|
||||
do_cleanups (back_to);
|
||||
@ -262,15 +289,19 @@ elf_symtab_read (abfd, addr, objfile)
|
||||
symbol tables. When more extensive information is requested of a
|
||||
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.
|
||||
for real.
|
||||
|
||||
We look for sections with specific names, to tell us what debug
|
||||
format to look for: FIXME!!!
|
||||
|
||||
dwarf_build_psymtabs() builds psymtabs for DWARF symbols;
|
||||
elfstab_build_psymtabs() handles STABS 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 gdb's minimal symbol table. This gives us some minimal debugging
|
||||
capability even for files compiled without -g.
|
||||
*/
|
||||
for linking. We process this also, and use the information to
|
||||
build gdb's minimal symbol table. This gives us some minimal debugging
|
||||
capability even for files compiled without -g. */
|
||||
|
||||
static void
|
||||
elf_symfile_read (objfile, addr, mainline)
|
||||
@ -282,6 +313,7 @@ elf_symfile_read (objfile, addr, mainline)
|
||||
struct elfinfo ei;
|
||||
struct cleanup *back_to;
|
||||
asection *text_sect;
|
||||
CORE_ADDR offset;
|
||||
|
||||
init_minimal_symbol_collection ();
|
||||
back_to = make_cleanup (discard_minimal_symbols, 0);
|
||||
@ -292,25 +324,47 @@ elf_symfile_read (objfile, addr, mainline)
|
||||
of the text section, we can compute the relocation amount. */
|
||||
|
||||
text_sect = bfd_get_section_by_name (objfile -> obfd, ".text");
|
||||
addr -= bfd_section_vma (objfile -> obfd, text_sect);
|
||||
offset = addr - bfd_section_vma (objfile -> obfd, text_sect);
|
||||
|
||||
/* Process the normal ELF symbol table first. */
|
||||
|
||||
elf_symtab_read (abfd, addr, objfile);
|
||||
elf_symtab_read (abfd, offset, objfile);
|
||||
|
||||
/* Now process the DWARF debugging information, which is contained in
|
||||
/* Now process 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, (PTR) &ei);
|
||||
if (ei.dboffset && ei.lnoffset)
|
||||
{
|
||||
/* DWARF sections */
|
||||
dwarf_build_psymtabs (fileno ((FILE *)(abfd -> iostream)),
|
||||
bfd_get_filename (abfd),
|
||||
addr, mainline,
|
||||
offset, mainline,
|
||||
ei.dboffset, ei.dbsize,
|
||||
ei.lnoffset, ei.lnsize, objfile);
|
||||
}
|
||||
if (ei.stabsect)
|
||||
{
|
||||
/* STABS sections */
|
||||
|
||||
/* FIXME: Sun didn't really know how to implement this well.
|
||||
They made .stab sections that don't point to the .stabstr
|
||||
section with the sh_link field. BFD doesn't make string table
|
||||
sections visible to the caller. So we have to search the
|
||||
ELF section table, not the BFD section table, for the string
|
||||
table. */
|
||||
Elf_Internal_Shdr *elf_sect = bfd_elf_find_section (abfd, ".stabstr");
|
||||
|
||||
if (elf_sect)
|
||||
elfstab_build_psymtabs (objfile,
|
||||
addr, /* We really pass the text seg addr, not the offset, here. */
|
||||
mainline,
|
||||
ei.stabsect->filepos, /* .stab offset */
|
||||
bfd_get_section_size_before_reloc (ei.stabsect),/* .stab size */
|
||||
elf_sect->sh_offset, /* .stabstr offset */
|
||||
elf_sect->sh_size); /* .stabstr size */
|
||||
}
|
||||
|
||||
if (!have_partial_symbols ())
|
||||
{
|
||||
@ -331,8 +385,7 @@ elf_symfile_read (objfile, addr, mainline)
|
||||
file is specified (not just adding some symbols from another file, e.g. a
|
||||
shared library).
|
||||
|
||||
For now at least, we have nothing in particular to do, so this function is
|
||||
just a stub. */
|
||||
We reinitialize buildsym, since we may be reading stabs from an ELF file. */
|
||||
|
||||
static void
|
||||
elf_new_init (ignore)
|
||||
|
@ -267,15 +267,15 @@ free_objfile (objfile)
|
||||
|
||||
if (objfile -> obfd != NULL)
|
||||
{
|
||||
char *name = bfd_get_filename (objfile->obfd);
|
||||
bfd_close (objfile -> obfd);
|
||||
free (name);
|
||||
}
|
||||
|
||||
/* Remove it from the chain of all objfiles. */
|
||||
|
||||
unlink_objfile (objfile);
|
||||
|
||||
#if 0 /* FIXME!! */
|
||||
|
||||
/* Before the symbol table code was redone to make it easier to
|
||||
selectively load and remove information particular to a specific
|
||||
linkage unit, gdb used to do these things whenever the monolithic
|
||||
@ -289,8 +289,6 @@ free_objfile (objfile)
|
||||
#endif
|
||||
clear_pc_function_cache ();
|
||||
|
||||
#endif
|
||||
|
||||
/* The last thing we do is free the objfile struct itself for the
|
||||
non-reusable case, or detach from the mapped file for the reusable
|
||||
case. Note that the mmalloc_detach or the mfree is the last thing
|
||||
@ -319,6 +317,10 @@ free_objfile (objfile)
|
||||
{
|
||||
mfree (objfile -> md, objfile -> name);
|
||||
}
|
||||
if (objfile->global_psymbols.list)
|
||||
mfree (objfile->md, objfile->global_psymbols.list);
|
||||
if (objfile->static_psymbols.list)
|
||||
mfree (objfile->md, objfile->static_psymbols.list);
|
||||
/* Free the obstacks for non-reusable objfiles */
|
||||
obstack_free (&objfile -> psymbol_obstack, 0);
|
||||
obstack_free (&objfile -> symbol_obstack, 0);
|
||||
|
@ -656,6 +656,7 @@ symfile_bfd_open (name)
|
||||
}
|
||||
free (name); /* Free 1st new malloc'd copy */
|
||||
name = absolute_name; /* Keep 2nd malloc'd copy in bfd */
|
||||
/* It'll be freed in free_objfile(). */
|
||||
|
||||
sym_bfd = bfd_fdopenr (name, NULL, desc);
|
||||
if (!sym_bfd)
|
||||
|
@ -711,7 +711,9 @@ block_depth (block)
|
||||
}
|
||||
|
||||
|
||||
/* Increase the space allocated for LISTP. */
|
||||
/* Increase the space allocated for LISTP, which is probably
|
||||
global_psymbol_list or static_psymbol_list. This space will eventually
|
||||
be freed in free_objfile(). */
|
||||
|
||||
void
|
||||
extend_psymbol_list (listp, objfile)
|
||||
|
Loading…
Reference in New Issue
Block a user