Relocate symbols using an array of section_offsets, rather than a
single `addr' or `offset'. This makes Solaris-2 support work, and permits better VxWorks (and maybe xcoff) support later. See ChangeLog.
This commit is contained in:
parent
76512886f9
commit
2670f34d21
10 changed files with 501 additions and 56 deletions
|
@ -1,3 +1,72 @@
|
||||||
|
Sat Jul 4 03:43:38 1992 John Gilmore (gnu at cygnus.com)
|
||||||
|
|
||||||
|
Relocate symbols using an array of section_offsets, rather than a
|
||||||
|
single `addr' or `offset'. This makes Solaris-2 support work, and
|
||||||
|
permits better VxWorks (and maybe xcoff) support later.
|
||||||
|
|
||||||
|
* symtab.h (struct section_offsets): New structure for keeping
|
||||||
|
a set of offsets, rather than a single one.
|
||||||
|
(struct objfile): Replace addr with section_offsets member.
|
||||||
|
* symfile.h: Add sym_offsets to struct sym_fns. Conforming changes.
|
||||||
|
* gdb-stabs.h: New include file with `symbol type specific'
|
||||||
|
parameters for psymtabs and objfiles.
|
||||||
|
* Makefile.in (HFILES): Add gdb-stabs.h.
|
||||||
|
* buildsym.h (start_psymtab, process_one_symbol): Fix prototypes.
|
||||||
|
* coffread.c: Conforming changes. Fake offset array always 0.
|
||||||
|
* dbxread.c: Conforming changes.
|
||||||
|
(struct dbx_symfile_info): Move to gdb-stabs.h.
|
||||||
|
(start_psymtab): Call elfstab_offset_sections to calculate good
|
||||||
|
offsets for this source file, based on the ELF symbol table info.
|
||||||
|
(read_ofile_symtab): Yank N_CATCH, which is dead.
|
||||||
|
(process_one_symbol, N_CATCH): Yank.
|
||||||
|
(", N_FUN, N_FNAME, N_FN, N_FN_SEQ, N_SO, N_SOL, N_ENTRY):
|
||||||
|
Relocate with SECT_OFF_TEXT.
|
||||||
|
(", N_STSYM, N_LCSYM, N_ROSYM): Grope around in the stab string
|
||||||
|
to distinguish relocatable from absolute symbols. Then, if not
|
||||||
|
absolute, do:
|
||||||
|
(", N_STSYM, N_DSLINE): SECT_OFF_DATA.
|
||||||
|
(", N_LCSYM, N_BSLINE): SECT_OFF_BSS.
|
||||||
|
(", N_ROSYM): SECT_OFF_RODATA.
|
||||||
|
(elfstab_build_psymtabs): Caller has allocated dbx_symfile_info.
|
||||||
|
(dbx_symfile_offsets): Add to translate addr to offset.
|
||||||
|
* dwarfread.c: Conforming changes. Single offset currently used.
|
||||||
|
* elfread.c: Add various complaints about elf/stab stuff.
|
||||||
|
#include gdb-stabs.h. Conforming changes, using a single offset.
|
||||||
|
(elf_symtab_read): Record info from BSF_FILE symbols, and local
|
||||||
|
variables called "Bbss.bss", "Ddata.data", and "Drodata.rodata",
|
||||||
|
for later use in building psymtabs.
|
||||||
|
(elf_symfile_read): Allocate dbx_symfile_info here, to keep
|
||||||
|
the info collected in elf_symtab_read. Cleanup calls free_elfinfo.
|
||||||
|
(free_elfinfo): New fn, frees all chained stab_section_infos
|
||||||
|
in an objfile, and zaps the start-of-chain pointer.
|
||||||
|
(elfstab_offset_sections): New fn, looks in stab_section_info
|
||||||
|
chain to determine section bases to relocate a psymtab's worth
|
||||||
|
of symbols, as they are being read.
|
||||||
|
* mipsread.c: Conforming changes. Stabs-reading will relocate
|
||||||
|
using one offset. MIPS-reading will not relocate at all.
|
||||||
|
* partial-stab.h: Relocate different symbol types using different
|
||||||
|
offsets from section_offsets.
|
||||||
|
* symfile.c: Conforming changes.
|
||||||
|
(find_lowest_section): Unused function to use later
|
||||||
|
to free us from the Tyranny of the Text Section.
|
||||||
|
(syms_from_objfile): Translate absolute arg ADDR to offsets used
|
||||||
|
in all lower layers of symbol reading. Call format-specific
|
||||||
|
sym_offsets function to initialize offsets for high speed symbol
|
||||||
|
reading.
|
||||||
|
(symbol_file_add): Call reinit_frame_cache so callers don't have to.
|
||||||
|
(symbol_file_command, add_symbol_file_command): Callers changed.
|
||||||
|
* symmisc.c (dump_psymtab): Print new relocation parameters.
|
||||||
|
* xcoffread.c: Corresponding changes.
|
||||||
|
|
||||||
|
* buildsym.c: Tidy innerblock_complaint and blockvector_complaint.
|
||||||
|
* main.c (main): Read the $HOME/.gdbinit file before processing
|
||||||
|
the argv arguments (e.g. reading symbol files or core
|
||||||
|
files). This allows global parameters to be set, which will apply
|
||||||
|
during the symbol reading. The ./.gdbinit is still read after
|
||||||
|
argv processing.
|
||||||
|
* symtab.c (list_symbols): `i variables' shouldn't show enum values.
|
||||||
|
* xcoffexec.c: Clean up quote inside comment.
|
||||||
|
|
||||||
Fri Jul 3 20:18:26 1992 Fred Fish (fnf@cygnus.com)
|
Fri Jul 3 20:18:26 1992 Fred Fish (fnf@cygnus.com)
|
||||||
|
|
||||||
* breakpoint.c, buildsym.c, c-exp.y, coffread.c, command.c,
|
* breakpoint.c, buildsym.c, c-exp.y, coffread.c, command.c,
|
||||||
|
|
|
@ -238,6 +238,7 @@ SFILES_KGDB = $(SFILES) stuff.c kdb-start.c
|
||||||
# Header files that are not named in config/* Makefile fragments go here.
|
# Header files that are not named in config/* Makefile fragments go here.
|
||||||
HFILES= breakpoint.h buildsym.h call-cmds.h command.h defs.h demangle.h \
|
HFILES= breakpoint.h buildsym.h call-cmds.h command.h defs.h demangle.h \
|
||||||
environ.h expression.h frame.h gdbcmd.h gdbcore.h gdbtypes.h \
|
environ.h expression.h frame.h gdbcmd.h gdbcore.h gdbtypes.h \
|
||||||
|
gdb-stabs.h \
|
||||||
ieee-float.h inferior.h minimon.h objfiles.h partial-stab.h \
|
ieee-float.h inferior.h minimon.h objfiles.h partial-stab.h \
|
||||||
serial.h signals.h symfile.h symtab.h solib.h xcoffsolib.h \
|
serial.h signals.h symfile.h symtab.h solib.h xcoffsolib.h \
|
||||||
target.h terminal.h tm-68k.h tm-i960.h tm-sunos.h tm-sysv4.h \
|
target.h terminal.h tm-68k.h tm-i960.h tm-sunos.h tm-sysv4.h \
|
||||||
|
|
|
@ -338,7 +338,8 @@ extern struct symbol *
|
||||||
define_symbol PARAMS ((unsigned int, char *, int, int, struct objfile *));
|
define_symbol PARAMS ((unsigned int, char *, int, int, struct objfile *));
|
||||||
|
|
||||||
extern struct partial_symtab *
|
extern struct partial_symtab *
|
||||||
start_psymtab PARAMS ((struct objfile *, CORE_ADDR, char *, CORE_ADDR, int,
|
start_psymtab PARAMS ((struct objfile *, struct section_offsets *, char *,
|
||||||
|
CORE_ADDR, int,
|
||||||
struct partial_symbol *, struct partial_symbol *));
|
struct partial_symbol *, struct partial_symbol *));
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
|
@ -346,9 +347,8 @@ end_psymtab PARAMS ((struct partial_symtab *, char **, int, int, CORE_ADDR,
|
||||||
struct partial_symtab **, int));
|
struct partial_symtab **, int));
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
process_one_symbol PARAMS ((int, int, CORE_ADDR, char *, int,
|
process_one_symbol PARAMS ((int, int, CORE_ADDR, char *,
|
||||||
struct objfile *));
|
struct section_offsets *, struct objfile *));
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
hashname PARAMS ((char *));
|
hashname PARAMS ((char *));
|
||||||
|
|
||||||
|
|
|
@ -206,8 +206,14 @@ static char *lnbase; /* Base pointer to line section */
|
||||||
static int isreg; /* Kludge to identify register variables */
|
static int isreg; /* Kludge to identify register variables */
|
||||||
static int offreg; /* Kludge to identify basereg references */
|
static int offreg; /* Kludge to identify basereg references */
|
||||||
|
|
||||||
|
/* This value is added to each symbol value. FIXME: Generalize to
|
||||||
|
the section_offsets structure used by dbxread. */
|
||||||
static CORE_ADDR baseaddr; /* Add to each symbol value */
|
static CORE_ADDR baseaddr; /* Add to each symbol value */
|
||||||
|
|
||||||
|
/* The section offsets used in the current psymtab or symtab. FIXME,
|
||||||
|
only used to pass one value (baseaddr) at the moment. */
|
||||||
|
static struct section_offsets *base_section_offsets;
|
||||||
|
|
||||||
/* Each partial symbol table entry contains a pointer to private data for the
|
/* Each partial symbol table entry contains a pointer to private data for the
|
||||||
read_symtab() function to use when expanding a partial symbol table entry
|
read_symtab() function to use when expanding a partial symbol table entry
|
||||||
to a full symbol table entry. For DWARF debugging info, this data is
|
to a full symbol table entry. For DWARF debugging info, this data is
|
||||||
|
@ -412,7 +418,8 @@ GLOBAL FUNCTION
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
|
|
||||||
void dwarf_build_psymtabs (int desc, char *filename, CORE_ADDR addr,
|
void dwarf_build_psymtabs (int desc, char *filename,
|
||||||
|
struct section_offsets *section_offsets,
|
||||||
int mainline, unsigned int dbfoff, unsigned int dbsize,
|
int mainline, unsigned int dbfoff, unsigned int dbsize,
|
||||||
unsigned int lnoffset, unsigned int lnsize,
|
unsigned int lnoffset, unsigned int lnsize,
|
||||||
struct objfile *objfile)
|
struct objfile *objfile)
|
||||||
|
@ -437,11 +444,11 @@ RETURNS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
dwarf_build_psymtabs (desc, filename, addr, mainline, dbfoff, dbsize,
|
dwarf_build_psymtabs (desc, filename, section_offsets, mainline, dbfoff, dbsize,
|
||||||
lnoffset, lnsize, objfile)
|
lnoffset, lnsize, objfile)
|
||||||
int desc;
|
int desc;
|
||||||
char *filename;
|
char *filename;
|
||||||
CORE_ADDR addr;
|
struct section_offsets *section_offsets;
|
||||||
int mainline;
|
int mainline;
|
||||||
unsigned int dbfoff;
|
unsigned int dbfoff;
|
||||||
unsigned int dbsize;
|
unsigned int dbsize;
|
||||||
|
@ -474,7 +481,8 @@ dwarf_build_psymtabs (desc, filename, addr, mainline, dbfoff, dbsize,
|
||||||
|
|
||||||
/* Save the relocation factor where everybody can see it. */
|
/* Save the relocation factor where everybody can see it. */
|
||||||
|
|
||||||
baseaddr = addr;
|
base_section_offsets = section_offsets;
|
||||||
|
baseaddr = ANOFFSET (section_offsets, 0);
|
||||||
|
|
||||||
/* Follow the compilation unit sibling chain, building a partial symbol
|
/* Follow the compilation unit sibling chain, building a partial symbol
|
||||||
table entry for each one. Save enough information about each compilation
|
table entry for each one. Save enough information about each compilation
|
||||||
|
@ -1943,7 +1951,8 @@ read_ofile_symtab (pst)
|
||||||
dbbase = xmalloc (DBLENGTH(pst));
|
dbbase = xmalloc (DBLENGTH(pst));
|
||||||
dbroff = DBROFF(pst);
|
dbroff = DBROFF(pst);
|
||||||
foffset = DBFOFF(pst) + dbroff;
|
foffset = DBFOFF(pst) + dbroff;
|
||||||
baseaddr = pst -> addr;
|
base_section_offsets = pst->section_offsets;
|
||||||
|
baseaddr = ANOFFSET (pst->section_offsets, 0);
|
||||||
if (bfd_seek (abfd, foffset, 0) ||
|
if (bfd_seek (abfd, foffset, 0) ||
|
||||||
(bfd_read (dbbase, DBLENGTH(pst), 1, abfd) != DBLENGTH(pst)))
|
(bfd_read (dbbase, DBLENGTH(pst), 1, abfd) != DBLENGTH(pst)))
|
||||||
{
|
{
|
||||||
|
@ -2454,7 +2463,7 @@ scan_compilation_units (filename, thisdie, enddie, dbfoff, lnoffset, objfile)
|
||||||
|
|
||||||
/* First allocate a new partial symbol table structure */
|
/* First allocate a new partial symbol table structure */
|
||||||
|
|
||||||
pst = start_psymtab_common (objfile, baseaddr, di.at_name,
|
pst = start_psymtab_common (objfile, base_section_offsets, di.at_name,
|
||||||
di.at_low_pc,
|
di.at_low_pc,
|
||||||
objfile -> global_psymbols.next,
|
objfile -> global_psymbols.next,
|
||||||
objfile -> static_psymbols.next);
|
objfile -> static_psymbols.next);
|
||||||
|
|
262
gdb/elfread.c
262
gdb/elfread.c
|
@ -43,8 +43,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "objfiles.h"
|
#include "objfiles.h"
|
||||||
#include "buildsym.h"
|
#include "buildsym.h"
|
||||||
|
|
||||||
|
#include <sys/types.h> /* For off_t for gdb-stabs.h */
|
||||||
|
#include "gdb-stabs.h"
|
||||||
|
|
||||||
#define STREQ(a,b) (strcmp((a),(b))==0)
|
#define STREQ(a,b) (strcmp((a),(b))==0)
|
||||||
|
|
||||||
|
/* The struct elfinfo is available only during ELF symbol table and
|
||||||
|
psymtab reading. It is destroyed at the complation of psymtab-reading.
|
||||||
|
It's local to elf_symfile_read. */
|
||||||
|
|
||||||
struct elfinfo {
|
struct elfinfo {
|
||||||
unsigned int dboffset; /* Offset to dwarf debug section */
|
unsigned int dboffset; /* Offset to dwarf debug section */
|
||||||
unsigned int dbsize; /* Size of dwarf debug section */
|
unsigned int dbsize; /* Size of dwarf debug section */
|
||||||
|
@ -54,6 +61,20 @@ struct elfinfo {
|
||||||
asection *stabindexsect; /* Section pointer for .stab.index section */
|
asection *stabindexsect; /* Section pointer for .stab.index section */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Various things we might complain about... */
|
||||||
|
|
||||||
|
struct complaint section_info_complaint =
|
||||||
|
{"elf/stab section information %s without a preceding file symbol", 0, 0};
|
||||||
|
|
||||||
|
struct complaint section_info_dup_complaint =
|
||||||
|
{"duplicated elf/stab section information for %s", 0, 0};
|
||||||
|
|
||||||
|
struct complaint stab_info_mismatch_complaint =
|
||||||
|
{"elf/stab section information missing for %s", 0, 0};
|
||||||
|
|
||||||
|
struct complaint stab_info_questionable_complaint =
|
||||||
|
{"elf/stab section information questionable for %s", 0, 0};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
elf_symfile_init PARAMS ((struct objfile *));
|
elf_symfile_init PARAMS ((struct objfile *));
|
||||||
|
|
||||||
|
@ -61,7 +82,7 @@ static void
|
||||||
elf_new_init PARAMS ((struct objfile *));
|
elf_new_init PARAMS ((struct objfile *));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
elf_symfile_read PARAMS ((struct objfile *, CORE_ADDR, int));
|
elf_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
elf_symfile_finish PARAMS ((struct objfile *));
|
elf_symfile_finish PARAMS ((struct objfile *));
|
||||||
|
@ -69,6 +90,12 @@ elf_symfile_finish PARAMS ((struct objfile *));
|
||||||
static void
|
static void
|
||||||
elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
|
elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_elfinfo PARAMS ((PTR));
|
||||||
|
|
||||||
|
static struct section_offsets *
|
||||||
|
elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static void
|
static void
|
||||||
record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type,
|
record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type,
|
||||||
|
@ -221,6 +248,12 @@ DESCRIPTION
|
||||||
or not (may be shared library for example), add all the global
|
or not (may be shared library for example), add all the global
|
||||||
function and data symbols to the minimal symbol table.
|
function and data symbols to the minimal symbol table.
|
||||||
|
|
||||||
|
In stabs-in-ELF, as implemented by Sun, there are some local symbols
|
||||||
|
defined in the ELF symbol table, which can be used to locate
|
||||||
|
the beginnings of sections from each ".o" file that was linked to
|
||||||
|
form the executable objfile. We gather any such info and record it
|
||||||
|
in data structures hung off the objfile's private data.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -234,9 +267,18 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
asymbol **symbol_table;
|
asymbol **symbol_table;
|
||||||
unsigned int number_of_symbols;
|
unsigned int number_of_symbols;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
int index;
|
||||||
struct cleanup *back_to;
|
struct cleanup *back_to;
|
||||||
CORE_ADDR symaddr;
|
CORE_ADDR symaddr;
|
||||||
enum minimal_symbol_type ms_type;
|
enum minimal_symbol_type ms_type;
|
||||||
|
/* If sectinfo is nonzero, it contains section info that should end up
|
||||||
|
filed in the objfile. */
|
||||||
|
struct stab_section_info *sectinfo = 0;
|
||||||
|
/* If filesym is nonzero, it points to a file symbol, but we haven't
|
||||||
|
seen any section info for it yet. */
|
||||||
|
asymbol *filesym = 0;
|
||||||
|
struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
|
||||||
|
objfile->sym_private;
|
||||||
|
|
||||||
storage_needed = get_symtab_upper_bound (abfd);
|
storage_needed = get_symtab_upper_bound (abfd);
|
||||||
|
|
||||||
|
@ -248,7 +290,7 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
|
|
||||||
for (i = 0; i < number_of_symbols; i++)
|
for (i = 0; i < number_of_symbols; i++)
|
||||||
{
|
{
|
||||||
sym = *symbol_table++;
|
sym = symbol_table[i];
|
||||||
/* Select global/weak symbols that are defined in a specific section.
|
/* Select global/weak symbols that are defined in a specific section.
|
||||||
Note that bfd now puts abs symbols in their own section, so
|
Note that bfd now puts abs symbols in their own section, so
|
||||||
all symbols we are interested in will have a section. */
|
all symbols we are interested in will have a section. */
|
||||||
|
@ -258,9 +300,8 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
symaddr = sym -> value;
|
symaddr = sym -> value;
|
||||||
/* Relocate all non-absolute symbols by base address. */
|
/* Relocate all non-absolute symbols by base address. */
|
||||||
if (sym -> section != &bfd_abs_section)
|
if (sym -> section != &bfd_abs_section)
|
||||||
{
|
symaddr += addr;
|
||||||
symaddr += addr;
|
|
||||||
}
|
|
||||||
/* For non-absolute symbols, use the type of the section
|
/* For non-absolute symbols, use the type of the section
|
||||||
they are relative to, to intuit text/data. Bfd provides
|
they are relative to, to intuit text/data. Bfd provides
|
||||||
no way of figuring this out for absolute symbols. */
|
no way of figuring this out for absolute symbols. */
|
||||||
|
@ -285,6 +326,69 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
record_minimal_symbol_and_info ((char *) sym -> name,
|
record_minimal_symbol_and_info ((char *) sym -> name,
|
||||||
symaddr, ms_type, sym->udata, objfile);
|
symaddr, ms_type, sym->udata, objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See if this is a debugging symbol that helps Solaris
|
||||||
|
stabs-in-elf debugging. */
|
||||||
|
|
||||||
|
else if (sym->flags & BSF_FILE)
|
||||||
|
{
|
||||||
|
/* Chain any old one onto the objfile; remember new sym. */
|
||||||
|
if (sectinfo)
|
||||||
|
{
|
||||||
|
sectinfo->next = dbx->stab_section_info;
|
||||||
|
dbx->stab_section_info = sectinfo;
|
||||||
|
sectinfo = 0;
|
||||||
|
}
|
||||||
|
filesym = sym;
|
||||||
|
}
|
||||||
|
else if ((sym->flags & BSF_LOCAL) &&
|
||||||
|
(sym->section) &&
|
||||||
|
(sym->section->flags & SEC_DATA) &&
|
||||||
|
(sym->name))
|
||||||
|
{
|
||||||
|
/* Named Local variable in a Data section. Check its name. */
|
||||||
|
index = -1;
|
||||||
|
switch (sym->name[1])
|
||||||
|
{
|
||||||
|
case 'b':
|
||||||
|
if (!strcmp ("Bbss.bss", sym->name))
|
||||||
|
index = SECT_OFF_BSS;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
if (!strcmp ("Ddata.data", sym->name))
|
||||||
|
index = SECT_OFF_DATA;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
if (!strcmp ("Drodata.rodata", sym->name))
|
||||||
|
index = SECT_OFF_RODATA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (index > 0)
|
||||||
|
{
|
||||||
|
/* We have some new info. Allocate a sectinfo, if
|
||||||
|
needed, and fill it in. */
|
||||||
|
if (!sectinfo)
|
||||||
|
{
|
||||||
|
sectinfo = (struct stab_section_info *)
|
||||||
|
xmmalloc (objfile -> md,
|
||||||
|
sizeof (*sectinfo));
|
||||||
|
memset ((PTR) sectinfo, 0, sizeof (*sectinfo));
|
||||||
|
if (!filesym)
|
||||||
|
complain (§ion_info_complaint, (char *)sym->name);
|
||||||
|
else
|
||||||
|
sectinfo->filename = (char *)filesym->name;
|
||||||
|
}
|
||||||
|
if (sectinfo->sections[index])
|
||||||
|
complain (§ion_info_dup_complaint,
|
||||||
|
(char *)sectinfo->filename);
|
||||||
|
|
||||||
|
symaddr = sym -> value;
|
||||||
|
/* Relocate all non-absolute symbols by base address. */
|
||||||
|
if (sym -> section != &bfd_abs_section)
|
||||||
|
symaddr += addr;
|
||||||
|
sectinfo->sections[index] = symaddr;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
do_cleanups (back_to);
|
do_cleanups (back_to);
|
||||||
}
|
}
|
||||||
|
@ -294,8 +398,9 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
We have been initialized by a call to elf_symfile_init, which
|
We have been initialized by a call to elf_symfile_init, which
|
||||||
currently does nothing.
|
currently does nothing.
|
||||||
|
|
||||||
ADDR is the address relative to which the symbols in it are (e.g.
|
SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
|
||||||
the base address of the text segment).
|
in each section. We simplify it down to a single offset for all
|
||||||
|
symbols. FIXME.
|
||||||
|
|
||||||
MAINLINE is true if we are reading the main symbol
|
MAINLINE is true if we are reading the main symbol
|
||||||
table (as opposed to a shared lib or dynamically loaded file).
|
table (as opposed to a shared lib or dynamically loaded file).
|
||||||
|
@ -321,13 +426,14 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
capability even for files compiled without -g. */
|
capability even for files compiled without -g. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
elf_symfile_read (objfile, addr, mainline)
|
elf_symfile_read (objfile, section_offsets, mainline)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
CORE_ADDR addr;
|
struct section_offsets *section_offsets;
|
||||||
int mainline;
|
int mainline;
|
||||||
{
|
{
|
||||||
bfd *abfd = objfile->obfd;
|
bfd *abfd = objfile->obfd;
|
||||||
struct elfinfo ei;
|
struct elfinfo ei;
|
||||||
|
struct dbx_symfile_info *dbx;
|
||||||
struct cleanup *back_to;
|
struct cleanup *back_to;
|
||||||
asection *text_sect;
|
asection *text_sect;
|
||||||
CORE_ADDR offset;
|
CORE_ADDR offset;
|
||||||
|
@ -335,29 +441,32 @@ elf_symfile_read (objfile, addr, mainline)
|
||||||
init_minimal_symbol_collection ();
|
init_minimal_symbol_collection ();
|
||||||
back_to = make_cleanup (discard_minimal_symbols, 0);
|
back_to = make_cleanup (discard_minimal_symbols, 0);
|
||||||
|
|
||||||
/* Compute the amount to relocate all symbols by. The value passed in
|
memset ((char *) &ei, 0, sizeof (ei));
|
||||||
as ADDR is typically either the actual address of the text section,
|
|
||||||
or a user specified address. By subtracting off the actual address
|
|
||||||
of the text section, we can compute the relocation amount. */
|
|
||||||
|
|
||||||
text_sect = bfd_get_section_by_name (objfile -> obfd, ".text");
|
/* Allocate struct to keep track of the symfile */
|
||||||
offset = addr - bfd_section_vma (objfile -> obfd, text_sect);
|
objfile->sym_private = (PTR)
|
||||||
|
xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
|
||||||
|
memset ((char *) objfile->sym_private, 0, sizeof (struct dbx_symfile_info));
|
||||||
|
make_cleanup (free_elfinfo, (PTR) objfile);
|
||||||
|
|
||||||
/* Process the normal ELF symbol table first. */
|
/* Process the normal ELF symbol table first. This may write some
|
||||||
|
chain of info into the dbx_symfile_info in objfile->sym_private,
|
||||||
|
which can later be used by elfstab_offset_sections. */
|
||||||
|
|
||||||
|
/* FIXME, should take a section_offsets param, not just an offset. */
|
||||||
|
offset = ANOFFSET (section_offsets, 0);
|
||||||
elf_symtab_read (abfd, offset, objfile);
|
elf_symtab_read (abfd, offset, objfile);
|
||||||
|
|
||||||
/* Now process debugging information, which is contained in
|
/* Now process debugging information, which is contained in
|
||||||
special ELF sections. We first have to find them... */
|
special ELF sections. We first have to find them... */
|
||||||
|
|
||||||
memset ((char *) &ei, 0, sizeof (ei));
|
|
||||||
bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
|
bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
|
||||||
if (ei.dboffset && ei.lnoffset)
|
if (ei.dboffset && ei.lnoffset)
|
||||||
{
|
{
|
||||||
/* DWARF sections */
|
/* DWARF sections */
|
||||||
dwarf_build_psymtabs (fileno ((FILE *)(abfd -> iostream)),
|
dwarf_build_psymtabs (fileno ((FILE *)(abfd -> iostream)),
|
||||||
bfd_get_filename (abfd),
|
bfd_get_filename (abfd),
|
||||||
offset, mainline,
|
section_offsets, mainline,
|
||||||
ei.dboffset, ei.dbsize,
|
ei.dboffset, ei.dbsize,
|
||||||
ei.lnoffset, ei.lnsize, objfile);
|
ei.lnoffset, ei.lnsize, objfile);
|
||||||
}
|
}
|
||||||
|
@ -376,7 +485,7 @@ elf_symfile_read (objfile, addr, mainline)
|
||||||
elf_sect = bfd_elf_find_section (abfd, ".stabstr");
|
elf_sect = bfd_elf_find_section (abfd, ".stabstr");
|
||||||
if (elf_sect)
|
if (elf_sect)
|
||||||
elfstab_build_psymtabs (objfile,
|
elfstab_build_psymtabs (objfile,
|
||||||
addr, /* We really pass the text seg addr, not the offset, here. */
|
section_offsets,
|
||||||
mainline,
|
mainline,
|
||||||
ei.stabsect->filepos, /* .stab offset */
|
ei.stabsect->filepos, /* .stab offset */
|
||||||
bfd_get_section_size_before_reloc (ei.stabsect),/* .stab size */
|
bfd_get_section_size_before_reloc (ei.stabsect),/* .stab size */
|
||||||
|
@ -399,6 +508,30 @@ elf_symfile_read (objfile, addr, mainline)
|
||||||
do_cleanups (back_to);
|
do_cleanups (back_to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This cleans up the objfile's sym_private pointer, and the chain of
|
||||||
|
stab_section_info's, that might be dangling from it. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_elfinfo (objp)
|
||||||
|
PTR objp;
|
||||||
|
{
|
||||||
|
struct objfile *objfile = (struct objfile *)objp;
|
||||||
|
struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
|
||||||
|
objfile->sym_private;
|
||||||
|
struct stab_section_info *ssi, *nssi;
|
||||||
|
|
||||||
|
ssi = dbxinfo->stab_section_info;
|
||||||
|
while (ssi)
|
||||||
|
{
|
||||||
|
nssi = ssi->next;
|
||||||
|
mfree (objfile->md, ssi);
|
||||||
|
ssi = nssi;
|
||||||
|
}
|
||||||
|
|
||||||
|
dbxinfo->stab_section_info = 0; /* Just say No mo info about this. */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Initialize anything that needs initializing when a completely new symbol
|
/* Initialize anything that needs initializing when a completely new symbol
|
||||||
file is specified (not just adding some symbols from another file, e.g. a
|
file is specified (not just adding some symbols from another file, e.g. a
|
||||||
shared library).
|
shared library).
|
||||||
|
@ -442,6 +575,96 @@ elf_symfile_init (ignore)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ELF specific parsing routine for section offsets.
|
||||||
|
|
||||||
|
Plain and simple for now. */
|
||||||
|
|
||||||
|
static
|
||||||
|
struct section_offsets *
|
||||||
|
elf_symfile_offsets (objfile, addr)
|
||||||
|
struct objfile *objfile;
|
||||||
|
CORE_ADDR addr;
|
||||||
|
{
|
||||||
|
struct section_offsets *section_offsets;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
section_offsets = (struct section_offsets *)
|
||||||
|
obstack_alloc (&objfile -> psymbol_obstack,
|
||||||
|
sizeof (struct section_offsets) +
|
||||||
|
sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
|
||||||
|
|
||||||
|
for (i = 0; i < SECT_OFF_MAX; i++)
|
||||||
|
ANOFFSET (section_offsets, i) = addr;
|
||||||
|
|
||||||
|
return section_offsets;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When handling an ELF file that contains Sun STABS debug info,
|
||||||
|
some of the debug info is relative to the particular chunk of the
|
||||||
|
section that was generated in its individual .o file. E.g.
|
||||||
|
offsets to static variables are relative to the start of the data
|
||||||
|
segment *for that module before linking*. This information is
|
||||||
|
painfully squirreled away in the ELF symbol table as local symbols
|
||||||
|
with wierd names. Go get 'em when needed. */
|
||||||
|
|
||||||
|
void
|
||||||
|
elfstab_offset_sections (objfile, pst)
|
||||||
|
struct objfile *objfile;
|
||||||
|
struct partial_symtab *pst;
|
||||||
|
{
|
||||||
|
char *filename = pst->filename;
|
||||||
|
struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
|
||||||
|
objfile->sym_private;
|
||||||
|
struct stab_section_info *maybe = dbx->stab_section_info;
|
||||||
|
struct stab_section_info *questionable = 0;
|
||||||
|
int i;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
/* The ELF symbol info doesn't include path names, so strip the path
|
||||||
|
(if any) from the psymtab filename. */
|
||||||
|
while (0 != (p = strchr (filename, '/')))
|
||||||
|
filename = p+1;
|
||||||
|
|
||||||
|
/* FIXME: This linear search could speed up significantly
|
||||||
|
if it was chained in the right order to match how we search it,
|
||||||
|
and if we unchained when we found a match. */
|
||||||
|
for (; maybe; maybe = maybe->next)
|
||||||
|
{
|
||||||
|
if (filename[0] == maybe->filename[0]
|
||||||
|
&& !strcmp (filename, maybe->filename))
|
||||||
|
{
|
||||||
|
/* We found a match. But there might be several source files
|
||||||
|
(from different directories) with the same name. */
|
||||||
|
if (0 == maybe->found)
|
||||||
|
break;
|
||||||
|
questionable = maybe; /* Might use it later. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maybe == 0 && questionable != 0)
|
||||||
|
{
|
||||||
|
complain (&stab_info_questionable_complaint, filename);
|
||||||
|
maybe = questionable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maybe)
|
||||||
|
{
|
||||||
|
/* Found it! Allocate a new psymtab struct, and fill it in. */
|
||||||
|
maybe->found++;
|
||||||
|
pst->section_offsets = (struct section_offsets *)
|
||||||
|
obstack_alloc (&objfile -> psymbol_obstack,
|
||||||
|
sizeof (struct section_offsets) +
|
||||||
|
sizeof (pst->section_offsets->offsets) * (SECT_OFF_MAX-1));
|
||||||
|
|
||||||
|
for (i = 0; i < SECT_OFF_MAX; i++)
|
||||||
|
ANOFFSET (pst->section_offsets, i) = maybe->sections[i];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We were unable to find any offsets for this file. Complain. */
|
||||||
|
if (dbx->stab_section_info) /* If there *is* any info, */
|
||||||
|
complain (&stab_info_mismatch_complaint, filename);
|
||||||
|
}
|
||||||
|
|
||||||
/* Register that we are able to handle ELF object file formats and DWARF
|
/* Register that we are able to handle ELF object file formats and DWARF
|
||||||
debugging formats.
|
debugging formats.
|
||||||
|
@ -467,6 +690,7 @@ static struct sym_fns elf_sym_fns =
|
||||||
elf_symfile_init, /* sym_init: read initial info, setup for sym_read() */
|
elf_symfile_init, /* sym_init: read initial info, setup for sym_read() */
|
||||||
elf_symfile_read, /* sym_read: read a symbol file into symtab */
|
elf_symfile_read, /* sym_read: read a symbol file into symtab */
|
||||||
elf_symfile_finish, /* sym_finish: finished with file, cleanup */
|
elf_symfile_finish, /* sym_finish: finished with file, cleanup */
|
||||||
|
elf_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */
|
||||||
NULL /* next: pointer to next struct sym_fns */
|
NULL /* next: pointer to next struct sym_fns */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
86
gdb/gdb-stabs.h
Normal file
86
gdb/gdb-stabs.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/* Definitions for symbol-reading containing "stabs", for GDB.
|
||||||
|
Copyright 1992 Free Software Foundation, Inc.
|
||||||
|
Contributed by Cygnus Support. Written by John Gilmore.
|
||||||
|
|
||||||
|
This file is part of GDB.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
/* This file exists to hold the common definitions required of all the
|
||||||
|
symbol-readers that end up using stabs. The common use of these
|
||||||
|
`symbol-type-specific' customizations of the generic data structures
|
||||||
|
makes the stabs-oriented symbol readers able to call each others'
|
||||||
|
functions as required. */
|
||||||
|
|
||||||
|
#if !defined (GDBSTABS_H)
|
||||||
|
#define GDBSTABS_H
|
||||||
|
|
||||||
|
/* Offsets in the psymtab's section_offsets array for various kinds of
|
||||||
|
stabs symbols. Every psymtab built from stabs will have these offsets
|
||||||
|
filled in by these guidelines, so that when actually reading symbols, the
|
||||||
|
proper offset can simply be selected and added to the symbol value. */
|
||||||
|
|
||||||
|
#define SECT_OFF_TEXT 0
|
||||||
|
#define SECT_OFF_DATA 1
|
||||||
|
#define SECT_OFF_BSS 2
|
||||||
|
#define SECT_OFF_RODATA 3
|
||||||
|
#define SECT_OFF_MAX 4 /* Count of possible values */
|
||||||
|
|
||||||
|
/* The stab_section_info chain remembers info from the ELF symbol table,
|
||||||
|
while psymtabs are being built for the other symbol tables in the
|
||||||
|
objfile. It is destroyed at the complation of psymtab-reading.
|
||||||
|
Any info that was used from it has been copied into psymtabs. */
|
||||||
|
|
||||||
|
struct stab_section_info {
|
||||||
|
char *filename;
|
||||||
|
CORE_ADDR sections[SECT_OFF_MAX];
|
||||||
|
struct stab_section_info *next;
|
||||||
|
int found; /* Count of times it's found in searching */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Information is passed among various dbxread routines for accessing
|
||||||
|
symbol files. A pointer to this structure is kept in the sym_private
|
||||||
|
field of the objfile struct. */
|
||||||
|
|
||||||
|
struct dbx_symfile_info {
|
||||||
|
asection *text_sect; /* Text section accessor */
|
||||||
|
int symcount; /* How many symbols are there in the file */
|
||||||
|
char *stringtab; /* The actual string table */
|
||||||
|
int stringtab_size; /* Its size */
|
||||||
|
off_t symtab_offset; /* Offset in file to symbol table */
|
||||||
|
int symbol_size; /* Bytes in a single symbol */
|
||||||
|
struct stab_section_info *stab_section_info; /* section starting points
|
||||||
|
of the original .o files before linking. */
|
||||||
|
/* FIXME: HP kludges that shouldn't be here, probably. */
|
||||||
|
int hp_symcount;
|
||||||
|
char *hp_stringtab;
|
||||||
|
int hp_stringtab_size;
|
||||||
|
off_t hp_symtab_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DBX_SYMFILE_INFO(o) ((struct dbx_symfile_info *)((o)->sym_private))
|
||||||
|
#define DBX_TEXT_SECT(o) (DBX_SYMFILE_INFO(o)->text_sect)
|
||||||
|
#define DBX_SYMCOUNT(o) (DBX_SYMFILE_INFO(o)->symcount)
|
||||||
|
#define DBX_STRINGTAB(o) (DBX_SYMFILE_INFO(o)->stringtab)
|
||||||
|
#define DBX_STRINGTAB_SIZE(o) (DBX_SYMFILE_INFO(o)->stringtab_size)
|
||||||
|
#define DBX_SYMTAB_OFFSET(o) (DBX_SYMFILE_INFO(o)->symtab_offset)
|
||||||
|
#define DBX_SYMBOL_SIZE(o) (DBX_SYMFILE_INFO(o)->symbol_size)
|
||||||
|
/* We don't use a macro for stab_section_info. */
|
||||||
|
#define HP_SYMCOUNT(o) (DBX_SYMFILE_INFO(o)->hp_symcount)
|
||||||
|
#define HP_STRINGTAB(o) (DBX_SYMFILE_INFO(o)->hp_stringtab)
|
||||||
|
#define HP_STRINGTAB_SIZE(o) (DBX_SYMFILE_INFO(o)->hp_stringtab_size)
|
||||||
|
#define HP_SYMTAB_OFFSET(o) (DBX_SYMFILE_INFO(o)->hp_symtab_offset)
|
||||||
|
|
||||||
|
#endif /* GDBSTABS_H */
|
|
@ -35,16 +35,23 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
case N_TEXT | N_EXT:
|
case N_TEXT | N_EXT:
|
||||||
case N_NBTEXT | N_EXT:
|
case N_NBTEXT | N_EXT:
|
||||||
case N_NBDATA | N_EXT:
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
case N_NBBSS | N_EXT:
|
goto record_it;
|
||||||
case N_SETV | N_EXT:
|
|
||||||
case N_ABS | N_EXT:
|
|
||||||
case N_DATA | N_EXT:
|
case N_DATA | N_EXT:
|
||||||
|
case N_NBDATA | N_EXT:
|
||||||
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
|
goto record_it;
|
||||||
|
|
||||||
case N_BSS | N_EXT:
|
case N_BSS | N_EXT:
|
||||||
|
case N_NBBSS | N_EXT:
|
||||||
|
case N_SETV | N_EXT: /* FIXME, is this in BSS? */
|
||||||
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
||||||
|
goto record_it;
|
||||||
|
|
||||||
|
case N_ABS | N_EXT:
|
||||||
|
record_it:
|
||||||
#ifdef DBXREAD_ONLY
|
#ifdef DBXREAD_ONLY
|
||||||
|
|
||||||
CUR_SYMBOL_VALUE += addr; /* Relocate */
|
|
||||||
|
|
||||||
SET_NAMESTRING();
|
SET_NAMESTRING();
|
||||||
|
|
||||||
bss_ext_symbol:
|
bss_ext_symbol:
|
||||||
|
@ -66,7 +73,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
case N_FN_SEQ:
|
case N_FN_SEQ:
|
||||||
case N_TEXT:
|
case N_TEXT:
|
||||||
#ifdef DBXREAD_ONLY
|
#ifdef DBXREAD_ONLY
|
||||||
CUR_SYMBOL_VALUE += addr; /* Relocate */
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
SET_NAMESTRING();
|
SET_NAMESTRING();
|
||||||
if ((namestring[0] == '-' && namestring[1] == 'l')
|
if ((namestring[0] == '-' && namestring[1] == 'l')
|
||||||
|| (namestring [(nsl = strlen (namestring)) - 1] == 'o'
|
|| (namestring [(nsl = strlen (namestring)) - 1] == 'o'
|
||||||
|
@ -79,8 +86,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
{
|
{
|
||||||
#ifndef hp9000s800
|
#ifndef hp9000s800
|
||||||
if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE &&
|
if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE &&
|
||||||
objfile -> ei.entry_point >= last_o_file_start &&
|
objfile -> ei.entry_point >= last_o_file_start)
|
||||||
addr == 0) /* FIXME nogood nomore */
|
|
||||||
{
|
{
|
||||||
objfile -> ei.entry_file_lowpc = last_o_file_start;
|
objfile -> ei.entry_file_lowpc = last_o_file_start;
|
||||||
objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE;
|
objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE;
|
||||||
|
@ -107,7 +113,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
case N_DATA:
|
case N_DATA:
|
||||||
#ifdef DBXREAD_ONLY
|
#ifdef DBXREAD_ONLY
|
||||||
CUR_SYMBOL_VALUE += addr; /* Relocate */
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
SET_NAMESTRING ();
|
SET_NAMESTRING ();
|
||||||
/* Check for __DYNAMIC, which is used by Sun shared libraries.
|
/* Check for __DYNAMIC, which is used by Sun shared libraries.
|
||||||
Record it even if it's local, not global, so we can find it.
|
Record it even if it's local, not global, so we can find it.
|
||||||
|
@ -115,10 +121,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0))
|
if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0))
|
||||||
|| VTBL_PREFIX_P ((namestring+HASH_OFFSET)))
|
|| VTBL_PREFIX_P ((namestring+HASH_OFFSET)))
|
||||||
{
|
{
|
||||||
/* Not really a function here, but... */
|
|
||||||
record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
|
record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
|
||||||
CUR_SYMBOL_TYPE, objfile); /* Always */
|
CUR_SYMBOL_TYPE, objfile); /* Always */
|
||||||
}
|
}
|
||||||
#endif /* DBXREAD_ONLY */
|
#endif /* DBXREAD_ONLY */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -202,7 +207,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
SET_NAMESTRING();
|
SET_NAMESTRING();
|
||||||
|
|
||||||
valu += addr; /* Relocate */
|
valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
|
|
||||||
if (pst)
|
if (pst)
|
||||||
{
|
{
|
||||||
|
@ -239,7 +244,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
tmp = dir_so_symnum;
|
tmp = dir_so_symnum;
|
||||||
else
|
else
|
||||||
tmp = symnum;
|
tmp = symnum;
|
||||||
pst = START_PSYMTAB (objfile, addr,
|
pst = START_PSYMTAB (objfile, section_offsets,
|
||||||
namestring, valu,
|
namestring, valu,
|
||||||
tmp * symbol_size,
|
tmp * symbol_size,
|
||||||
objfile -> global_psymbols.next,
|
objfile -> global_psymbols.next,
|
||||||
|
@ -320,6 +325,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
case N_LSYM: /* Typedef or automatic variable. */
|
case N_LSYM: /* Typedef or automatic variable. */
|
||||||
case N_STSYM: /* Data seg var -- static */
|
case N_STSYM: /* Data seg var -- static */
|
||||||
case N_LCSYM: /* BSS " */
|
case N_LCSYM: /* BSS " */
|
||||||
|
case N_ROSYM: /* Read-only data seg var -- static. */
|
||||||
case N_NBSTS: /* Gould nobase. */
|
case N_NBSTS: /* Gould nobase. */
|
||||||
case N_NBLCS: /* symbols. */
|
case N_NBLCS: /* symbols. */
|
||||||
|
|
||||||
|
@ -430,7 +436,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
case N_FUN:
|
case N_FUN:
|
||||||
case N_GSYM: /* Global (extern) variable; can be
|
case N_GSYM: /* Global (extern) variable; can be
|
||||||
data or bss (sigh). */
|
data or bss (sigh FIXME). */
|
||||||
|
|
||||||
/* Following may probably be ignored; I'll leave them here
|
/* Following may probably be ignored; I'll leave them here
|
||||||
for now (until I do Pascal and Modula 2 extensions). */
|
for now (until I do Pascal and Modula 2 extensions). */
|
||||||
|
@ -463,13 +469,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
objfile->static_psymbols, CUR_SYMBOL_VALUE);
|
objfile->static_psymbols, CUR_SYMBOL_VALUE);
|
||||||
continue;
|
continue;
|
||||||
case 'S':
|
case 'S':
|
||||||
CUR_SYMBOL_VALUE += addr; /* Relocate */
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
|
ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
|
||||||
VAR_NAMESPACE, LOC_STATIC,
|
VAR_NAMESPACE, LOC_STATIC,
|
||||||
objfile->static_psymbols, CUR_SYMBOL_VALUE);
|
objfile->static_psymbols, CUR_SYMBOL_VALUE);
|
||||||
continue;
|
continue;
|
||||||
case 'G':
|
case 'G':
|
||||||
CUR_SYMBOL_VALUE += addr; /* Relocate */
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
/* The addresses in these entries are reported to be
|
/* The addresses in these entries are reported to be
|
||||||
wrong. See the code that reads 'G's for symtabs. */
|
wrong. See the code that reads 'G's for symtabs. */
|
||||||
ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
|
ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
|
||||||
|
|
|
@ -264,8 +264,15 @@ dump_psymtab (objfile, psymtab, outfile)
|
||||||
" Full symtab was read (at 0x%x by function at 0x%x)\n",
|
" Full symtab was read (at 0x%x by function at 0x%x)\n",
|
||||||
psymtab -> symtab, psymtab -> read_symtab);
|
psymtab -> symtab, psymtab -> read_symtab);
|
||||||
}
|
}
|
||||||
fprintf_filtered (outfile, " Relocate symbols by 0x%x\n",
|
|
||||||
psymtab -> addr);
|
/* FIXME, we need to be able to print the relocation stuff. */
|
||||||
|
/* This prints some garbage for anything but stabs right now. FIXME. */
|
||||||
|
fprintf_filtered (outfile, " Relocate symbols by 0x%x, 0x%x, 0x%x, 0x%x.\n",
|
||||||
|
ANOFFSET (psymtab->section_offsets, 0),
|
||||||
|
ANOFFSET (psymtab->section_offsets, 1),
|
||||||
|
ANOFFSET (psymtab->section_offsets, 2),
|
||||||
|
ANOFFSET (psymtab->section_offsets, 3));
|
||||||
|
|
||||||
fprintf_filtered (outfile, " Symbols cover text addresses 0x%x-0x%x\n",
|
fprintf_filtered (outfile, " Symbols cover text addresses 0x%x-0x%x\n",
|
||||||
psymtab -> textlow, psymtab -> texthigh);
|
psymtab -> textlow, psymtab -> texthigh);
|
||||||
fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
|
fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
|
||||||
|
|
24
gdb/symtab.h
24
gdb/symtab.h
|
@ -334,6 +334,23 @@ struct source
|
||||||
struct linetable contents;
|
struct linetable contents;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* How to relocate the symbols from each section in a symbol file.
|
||||||
|
Each struct contains an array of offsets.
|
||||||
|
The ordering and meaning of the offsets is file-type-dependent;
|
||||||
|
typically it is indexed by section numbers or symbol types or
|
||||||
|
something like that.
|
||||||
|
|
||||||
|
To give us flexibility in changing the internal representation
|
||||||
|
of these offsets, the ANOFFSET macro must be used to insert and
|
||||||
|
extract offset values in the struct. */
|
||||||
|
|
||||||
|
struct section_offsets
|
||||||
|
{
|
||||||
|
CORE_ADDR offsets[1]; /* As many as needed. */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ANOFFSET(secoff, whichone) (secoff->offsets[whichone])
|
||||||
|
|
||||||
/* Each source file is represented by a struct symtab.
|
/* Each source file is represented by a struct symtab.
|
||||||
These objects are chained through the `next' field. */
|
These objects are chained through the `next' field. */
|
||||||
|
|
||||||
|
@ -404,10 +421,9 @@ struct partial_symtab
|
||||||
/* Information about the object file from which symbols should be read. */
|
/* Information about the object file from which symbols should be read. */
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
|
|
||||||
/* Address relative to which the symbols in this file are. Need to
|
/* Set of relocation offsets to apply to each section. */
|
||||||
relocate by this amount when reading in symbols from the symbol
|
struct section_offsets *section_offsets;
|
||||||
file. */
|
|
||||||
CORE_ADDR addr;
|
|
||||||
/* Range of text addresses covered by this file; texthigh is the
|
/* Range of text addresses covered by this file; texthigh is the
|
||||||
beginning of the next section. */
|
beginning of the next section. */
|
||||||
CORE_ADDR textlow, texthigh;
|
CORE_ADDR textlow, texthigh;
|
||||||
|
|
|
@ -45,6 +45,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "symfile.h"
|
#include "symfile.h"
|
||||||
#include "objfiles.h"
|
#include "objfiles.h"
|
||||||
#include "buildsym.h"
|
#include "buildsym.h"
|
||||||
|
#include "gdb-stabs.h"
|
||||||
|
|
||||||
#include "coff/internal.h" /* FIXME, internal data from BFD */
|
#include "coff/internal.h" /* FIXME, internal data from BFD */
|
||||||
#include "libcoff.h" /* FIXME, internal data from BFD */
|
#include "libcoff.h" /* FIXME, internal data from BFD */
|
||||||
|
@ -182,11 +183,14 @@ static void
|
||||||
aixcoff_new_init PARAMS ((struct objfile *));
|
aixcoff_new_init PARAMS ((struct objfile *));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
aixcoff_symfile_read PARAMS ((struct objfile *, CORE_ADDR, int));
|
aixcoff_symfile_read PARAMS ((struct objfile *, struct section_offset *, int));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
aixcoff_symfile_finish PARAMS ((struct objfile *));
|
aixcoff_symfile_finish PARAMS ((struct objfile *));
|
||||||
|
|
||||||
|
static struct section_offset *
|
||||||
|
aixcoff_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
|
||||||
|
|
||||||
static int
|
static int
|
||||||
init_lineno PARAMS ((bfd *, long, int));
|
init_lineno PARAMS ((bfd *, long, int));
|
||||||
|
|
||||||
|
@ -2238,9 +2242,9 @@ free_debugsection()
|
||||||
/* aixcoff version of symbol file read. */
|
/* aixcoff version of symbol file read. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
aixcoff_symfile_read (objfile, addr, mainline)
|
aixcoff_symfile_read (objfile, section_offset, mainline)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
CORE_ADDR addr;
|
struct section_offset *section_offset;
|
||||||
int mainline;
|
int mainline;
|
||||||
{
|
{
|
||||||
int num_symbols; /* # of symbols */
|
int num_symbols; /* # of symbols */
|
||||||
|
@ -2320,6 +2324,28 @@ aixcoff_symfile_read (objfile, addr, mainline)
|
||||||
select_source_symtab (0);
|
select_source_symtab (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XCOFF-specific parsing routine for section offsets.
|
||||||
|
Plain and simple for now. */
|
||||||
|
|
||||||
|
static
|
||||||
|
struct section_offsets *
|
||||||
|
aixcoff_symfile_offsets (objfile, addr)
|
||||||
|
struct objfile *objfile;
|
||||||
|
CORE_ADDR addr;
|
||||||
|
{
|
||||||
|
struct section_offsets *section_offsets;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
section_offsets = (struct section_offsets *)
|
||||||
|
obstack_alloc (&objfile -> psymbol_obstack,
|
||||||
|
sizeof (struct section_offsets) +
|
||||||
|
sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
|
||||||
|
|
||||||
|
for (i = 0; i < SECT_OFF_MAX; i++)
|
||||||
|
ANOFFSET (section_offsets, i) = addr;
|
||||||
|
|
||||||
|
return section_offsets;
|
||||||
|
}
|
||||||
/* Register our ability to parse symbols for aixcoff BFD files. */
|
/* Register our ability to parse symbols for aixcoff BFD files. */
|
||||||
|
|
||||||
static struct sym_fns aixcoff_sym_fns =
|
static struct sym_fns aixcoff_sym_fns =
|
||||||
|
@ -2330,6 +2356,7 @@ static struct sym_fns aixcoff_sym_fns =
|
||||||
aixcoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
|
aixcoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
|
||||||
aixcoff_symfile_read, /* sym_read: read a symbol file into symtab */
|
aixcoff_symfile_read, /* sym_read: read a symbol file into symtab */
|
||||||
aixcoff_symfile_finish, /* sym_finish: finished with file, cleanup */
|
aixcoff_symfile_finish, /* sym_finish: finished with file, cleanup */
|
||||||
|
aixcoff_symfile_offsets, /* sym_offsets: xlate offsets ext->int form */
|
||||||
NULL /* next: pointer to next struct sym_fns */
|
NULL /* next: pointer to next struct sym_fns */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue