* dbxread.c (read_dbx_dynamic_symtab): Reinstall support for sun3,

BFD handles sun3 dynamic relocations now.
	* elfread.c (elf_symtab_read, elf_symfile_read):  Handle dynamic
	symbol table.
This commit is contained in:
Peter Schauer 1994-04-21 17:09:31 +00:00
parent cb71adf12b
commit 0683ac4b2c
3 changed files with 82 additions and 30 deletions

View File

@ -1,3 +1,10 @@
Thu Apr 21 09:29:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* dbxread.c (read_dbx_dynamic_symtab): Reinstall support for sun3,
BFD handles sun3 dynamic relocations now.
* elfread.c (elf_symtab_read, elf_symfile_read): Handle dynamic
symbol table.
Wed Apr 20 19:41:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
* printcmd.c (print_command_1): Annotate the top-level expressions

View File

@ -890,13 +890,11 @@ read_dbx_dynamic_symtab (section_offsets, objfile)
asection *sec;
int type;
sym = *symptr;
sym_value = sym->value;
sec = bfd_get_section (sym);
/* BFD symbols are section relative. */
sym_value += sec->vma;
sym_value = sym->value + sec->vma;
if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
{
sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
@ -923,15 +921,6 @@ read_dbx_dynamic_symtab (section_offsets, objfile)
}
}
/* FIXME: Reading the dynamic relocs currently causes a bfd_assertion
for sun3 executables. Do not read dynamic relocs till BFD is prepared
to handle them. */
if (bfd_get_arch (abfd) != bfd_arch_sparc)
{
do_cleanups (back_to);
return;
}
/* Symbols from shared libraries have a dynamic relocation entry
that points to the associated slot in the procedure linkage table.
We make a mininal symbol table entry with type mst_solib_trampoline
@ -957,16 +946,30 @@ read_dbx_dynamic_symtab (section_offsets, objfile)
counter < dynrel_count;
counter++, relptr++)
{
arelent *rel;
arelent *rel = *relptr;
CORE_ADDR address = rel->address;
/* FIXME: This probably doesn't work on a Sun3. */
switch (bfd_get_arch (abfd))
{
case bfd_arch_sparc:
if (rel->howto->type != RELOC_JMP_SLOT)
continue;
break;
case bfd_arch_m68k:
/* `16' is the type BFD produces for a jump table relocation. */
if (rel->howto->type != 16)
continue;
rel = *relptr;
if (rel->howto->type != RELOC_JMP_SLOT)
continue;
/* Adjust address in the jump table to point to
the start of the bsr instruction. */
address -= 2;
break;
default:
continue;
}
prim_record_minimal_symbol (bfd_asymbol_name (*rel->sym_ptr_ptr),
rel->address,
address,
mst_solib_trampoline,
objfile);
}

View File

@ -1,5 +1,5 @@
/* Read ELF (Executable and Linking Format) object files for GDB.
Copyright 1991, 1992 Free Software Foundation, Inc.
Copyright 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
This file is part of GDB.
@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <sys/types.h> /* For time_t, if not in time.h. */
#include "libbfd.h" /* For bfd_elf_find_section */
#include "libelf.h"
#include "elf/mips.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
@ -75,7 +76,7 @@ static void
elf_symfile_finish PARAMS ((struct objfile *));
static void
elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *, int));
static void
free_elfinfo PARAMS ((void *));
@ -239,10 +240,11 @@ DESCRIPTION
*/
static void
elf_symtab_read (abfd, addr, objfile)
elf_symtab_read (abfd, addr, objfile, dynamic)
bfd *abfd;
CORE_ADDR addr;
struct objfile *objfile;
int dynamic;
{
long storage_needed;
asymbol *sym;
@ -262,8 +264,12 @@ elf_symtab_read (abfd, addr, objfile)
struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
objfile->sym_stab_info;
unsigned long size;
storage_needed = bfd_get_symtab_upper_bound (abfd);
int stripped = (bfd_get_symcount (abfd) == 0);
if (dynamic)
storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
else
storage_needed = bfd_get_symtab_upper_bound (abfd);
if (storage_needed < 0)
error ("Can't read symbols from %s: %s", bfd_get_filename (abfd),
bfd_errmsg (bfd_get_error ()));
@ -271,7 +277,11 @@ elf_symtab_read (abfd, addr, objfile)
{
symbol_table = (asymbol **) xmalloc (storage_needed);
back_to = make_cleanup (free, symbol_table);
number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
if (dynamic)
number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd,
symbol_table);
else
number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
if (number_of_symbols < 0)
error ("Can't read symbols from %s: %s", bfd_get_filename (abfd),
bfd_errmsg (bfd_get_error ()));
@ -284,6 +294,15 @@ elf_symtab_read (abfd, addr, objfile)
that are null strings (may happen). */
continue;
}
/* If it is a nonstripped executable, do not enter dynamic
symbols, as the dynamic symbol table is usually a subset
of the main symbol table.
On Irix 5 however, the symbols for the procedure linkage
table entries have meaningful values only in the dynamic
symbol table, so we always examine undefined symbols. */
if (dynamic && !stripped && sym -> section != &bfd_und_section)
continue;
if (sym -> flags & BSF_FILE)
{
/* STT_FILE debugging symbol that helps stabs-in-elf debugging.
@ -325,9 +344,8 @@ elf_symtab_read (abfd, addr, objfile)
meaningful address for this symbol in the
executable file, so we skip it.
Irix 5 has a zero value for all shared library functions
in the main symbol table. The dynamic symbol table
would provide the right values, but BFD currently
cannot handle dynamic ELF symbol tables. */
in the main symbol table, but the dynamic symbol table
provides the right values. */
ms_type = mst_solib_trampoline;
symaddr = sym -> value;
if (symaddr == 0)
@ -335,7 +353,26 @@ elf_symtab_read (abfd, addr, objfile)
}
else if (sym -> section == &bfd_abs_section)
{
ms_type = mst_abs;
/* This is a hack to get the minimal symbol type
right for Irix 5, which has absolute adresses
with special section indices for dynamic symbols. */
unsigned short shndx =
((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
switch (shndx)
{
case SHN_MIPS_TEXT:
ms_type = mst_text;
break;
case SHN_MIPS_DATA:
ms_type = mst_data;
break;
case SHN_MIPS_ACOMMON:
ms_type = mst_bss;
break;
default:
ms_type = mst_abs;
}
}
else if (sym -> section -> flags & SEC_CODE)
{
@ -521,7 +558,12 @@ elf_symfile_read (objfile, section_offsets, mainline)
/* 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, 0);
/* Add the dynamic symbols if we are reading the main symbol table. */
if (mainline)
elf_symtab_read (abfd, offset, objfile, 1);
/* Now process debugging information, which is contained in
special ELF sections. We first have to find them... */