* libelf.h (elf_obj_tdata): Add members for dynamic symbol table

handling.
	* elfcode.h (bfd_section_from_shdr):  Handle dynamic symbol table.
	* elfcode.h (elf_slurp_symbol_table):  Take additional parameter
	to select static or dynamic symbol table and return number of
	symbols slurped or -1 on error.
	* elfcode.h (elf_get_symtab):  Set bfd symcount from
	elf_slurp_symbol_table result.
	* elfcode.h (elf_get_dynamic_symtab_upper_bound,
	elf_canonicalize_dynamic_symtab):  New functions to handle dynamic
	symbol table.
	* elf32-target.h, elf64-target.h (BFD_JUMP_TABLE_DYNAMIC):
	Change to handle dynamic symbol table, provide default definitions
	for dynamic relocs.
	* aoutx.h (howto_table_std, NAME(aout,swap_std_reloc_out),
	NAME(aout,swap_std_reloc_in), aout_link_input_section_std,
	aout_link_reloc_link_order):  Handle r_jmptable and r_relative
	relocations.
This commit is contained in:
Peter Schauer 1994-04-21 17:01:12 +00:00
parent dcb210cb09
commit cb71adf12b
5 changed files with 122 additions and 28 deletions

View file

@ -1,3 +1,24 @@
Thu Apr 21 09:29:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* libelf.h (elf_obj_tdata): Add members for dynamic symbol table
handling.
* elfcode.h (bfd_section_from_shdr): Handle dynamic symbol table.
* elfcode.h (elf_slurp_symbol_table): Take additional parameter
to select static or dynamic symbol table and return number of
symbols slurped or -1 on error.
* elfcode.h (elf_get_symtab): Set bfd symcount from
elf_slurp_symbol_table result.
* elfcode.h (elf_get_dynamic_symtab_upper_bound,
elf_canonicalize_dynamic_symtab): New functions to handle dynamic
symbol table.
* elf32-target.h, elf64-target.h (BFD_JUMP_TABLE_DYNAMIC):
Change to handle dynamic symbol table, provide default definitions
for dynamic relocs.
* aoutx.h (howto_table_std, NAME(aout,swap_std_reloc_out),
NAME(aout,swap_std_reloc_in), aout_link_input_section_std,
aout_link_reloc_link_order): Handle r_jmptable and r_relative
relocations.
Thu Apr 21 11:58:19 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
* libnlm.h (struct nlm_obj_tdata): Add nlm_cygnus_section_hdr

View file

@ -59,6 +59,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define bfd_elf32_bfd_is_local_label bfd_generic_is_local_label
#endif
#ifndef bfd_elf32_get_dynamic_reloc_upper_bound
#define bfd_elf32_get_dynamic_reloc_upper_bound \
_bfd_nodynamic_get_dynamic_reloc_upper_bound
#endif
#ifndef bfd_elf32_canonicalize_dynamic_reloc
#define bfd_elf32_canonicalize_dynamic_reloc \
_bfd_nodynamic_canonicalize_dynamic_reloc
#endif
#ifndef elf_info_to_howto_rel
#define elf_info_to_howto_rel 0
#endif
@ -208,7 +217,7 @@ bfd_target TARGET_BIG_SYM =
BFD_JUMP_TABLE_RELOCS (bfd_elf32),
BFD_JUMP_TABLE_WRITE (bfd_elf32),
BFD_JUMP_TABLE_LINK (bfd_elf32),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
BFD_JUMP_TABLE_DYNAMIC (bfd_elf32),
/* backend_data: */
(PTR) &elf32_bed,
@ -296,7 +305,7 @@ bfd_target TARGET_LITTLE_SYM =
BFD_JUMP_TABLE_RELOCS (bfd_elf32),
BFD_JUMP_TABLE_WRITE (bfd_elf32),
BFD_JUMP_TABLE_LINK (bfd_elf32),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
BFD_JUMP_TABLE_DYNAMIC (bfd_elf32),
/* backend_data: */
(PTR) &elf32_bed,

View file

@ -62,6 +62,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define bfd_elf64_bfd_is_local_label bfd_generic_is_local_label
#endif
#ifndef bfd_elf64_get_dynamic_reloc_upper_bound
#define bfd_elf64_get_dynamic_reloc_upper_bound \
_bfd_nodynamic_get_dynamic_reloc_upper_bound
#endif
#ifndef bfd_elf64_canonicalize_dynamic_reloc
#define bfd_elf64_canonicalize_dynamic_reloc \
_bfd_nodynamic_canonicalize_dynamic_reloc
#endif
#ifndef elf_info_to_howto_rel
#define elf_info_to_howto_rel 0
#endif
@ -211,7 +220,7 @@ bfd_target TARGET_BIG_SYM =
BFD_JUMP_TABLE_RELOCS (bfd_elf64),
BFD_JUMP_TABLE_WRITE (bfd_elf64),
BFD_JUMP_TABLE_LINK (bfd_elf64),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
BFD_JUMP_TABLE_DYNAMIC (bfd_elf64),
/* backend_data: */
(PTR) &elf64_bed,
@ -299,7 +308,7 @@ bfd_target TARGET_LITTLE_SYM =
BFD_JUMP_TABLE_RELOCS (bfd_elf64),
BFD_JUMP_TABLE_WRITE (bfd_elf64),
BFD_JUMP_TABLE_LINK (bfd_elf64),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
BFD_JUMP_TABLE_DYNAMIC (bfd_elf64),
/* backend_data: */
(PTR) &elf64_bed,

View file

@ -75,13 +75,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command)
#define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal)
#define elf_core_file_matches_executable_p NAME(bfd_elf,core_file_matches_executable_p)
#define elf_core_file_matches_executable_p \
NAME(bfd_elf,core_file_matches_executable_p)
#define elf_object_p NAME(bfd_elf,object_p)
#define elf_core_file_p NAME(bfd_elf,core_file_p)
#define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound)
#define elf_get_dynamic_symtab_upper_bound \
NAME(bfd_elf,get_dynamic_symtab_upper_bound)
#define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound)
#define elf_canonicalize_reloc NAME(bfd_elf,canonicalize_reloc)
#define elf_get_symtab NAME(bfd_elf,get_symtab)
#define elf_canonicalize_dynamic_symtab \
NAME(bfd_elf,canonicalize_dynamic_symtab)
#define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol)
#define elf_get_symbol_info NAME(bfd_elf,get_symbol_info)
#define elf_print_symbol NAME(bfd_elf,print_symbol)
@ -123,7 +128,7 @@ static struct sec *section_from_elf_index PARAMS ((bfd *, unsigned int));
static int elf_section_from_bfd_section PARAMS ((bfd *, struct sec *));
static boolean elf_slurp_symbol_table PARAMS ((bfd *, asymbol **));
static long elf_slurp_symbol_table PARAMS ((bfd *, asymbol **, boolean));
static int elf_symbol_from_bfd_symbol PARAMS ((bfd *,
struct symbol_cache_entry **));
@ -547,6 +552,18 @@ bfd_section_from_shdr (abfd, shindex)
abfd->flags |= HAS_SYMS;
return true;
case SHT_DYNSYM: /* A dynamic symbol table */
if (elf_dynsymtab (abfd) == shindex)
return true;
BFD_ASSERT (hdr->sh_entsize == sizeof (Elf_External_Sym));
BFD_ASSERT (elf_dynsymtab (abfd) == 0);
elf_dynsymtab (abfd) = shindex;
elf_tdata (abfd)->dynsymtab_hdr = *hdr;
elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->dynsymtab_hdr;
abfd->flags |= HAS_SYMS;
return true;
case SHT_STRTAB: /* A string table */
if (hdr->rawdata)
return true;
@ -572,6 +589,12 @@ bfd_section_from_shdr (abfd, shindex)
elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
return true;
}
if (elf_dynsymtab (abfd) == i)
{
elf_tdata (abfd)->dynstrtab_hdr = *hdr;
elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->dynstrtab_hdr;
return true;
}
#if 0 /* Not handling other string tables specially right now. */
hdr2 = elf_elfsections (abfd)[i]; /* in case it moved */
/* We have a strtab for some random other section. */
@ -664,7 +687,6 @@ bfd_section_from_shdr (abfd, shindex)
break;
case SHT_HASH:
case SHT_DYNSYM: /* could treat this like symtab... */
#if 0
fprintf (stderr, "Dynamic Linking sections not yet supported.\n");
BFD_FAIL ();
@ -2584,25 +2606,19 @@ elf_symbol_from_bfd_symbol (abfd, asym_ptr_ptr)
return idx;
}
static boolean
elf_slurp_symbol_table (abfd, symptrs)
static long
elf_slurp_symbol_table (abfd, symptrs, dynamic)
bfd *abfd;
asymbol **symptrs; /* Buffer for generated bfd symbols */
boolean dynamic;
{
Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
Elf_Internal_Shdr *hdr;
long symcount; /* Number of external ELF symbols */
elf_symbol_type *sym; /* Pointer to current bfd symbol */
elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
Elf_Internal_Sym i_sym;
Elf_External_Sym *x_symp = NULL;
/* this is only valid because there is only one symtab... */
/* FIXME: This is incorrect, there may also be a dynamic symbol
table which is a subset of the full symbol table. We either need
to be prepared to read both (and merge them) or ensure that we
only read the full symbol table. Currently we only get called to
read the full symbol table. -fnf */
/* Read each raw ELF symbol, converting from external ELF form to
internal ELF form, and then using the information to create a
canonical bfd symbol table entry.
@ -2613,8 +2629,12 @@ elf_slurp_symbol_table (abfd, symptrs)
space left over at the end. When we have all the symbols, we
build the caller's pointer vector. */
if (dynamic)
hdr = &elf_tdata (abfd)->dynsymtab_hdr;
else
hdr = &elf_tdata (abfd)->symtab_hdr;
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
return false;
return -1;
symcount = hdr->sh_size / sizeof (Elf_External_Sym);
@ -2625,14 +2645,14 @@ elf_slurp_symbol_table (abfd, symptrs)
long i;
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
return false;
return -1;
symbase = ((elf_symbol_type *)
bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type)));
if (symbase == (elf_symbol_type *) NULL)
{
bfd_set_error (bfd_error_no_memory);
return false;
return -1;
}
sym = symbase;
@ -2716,6 +2736,9 @@ elf_slurp_symbol_table (abfd, symptrs)
break;
}
if (dynamic)
sym->symbol.flags |= BSF_DYNAMIC;
/* Do some backend-specific processing on this symbol. */
{
struct elf_backend_data *ebd = get_elf_backend_data (abfd);
@ -2736,13 +2759,15 @@ elf_slurp_symbol_table (abfd, symptrs)
/* We rely on the zalloc to clear out the final symbol entry. */
bfd_get_symcount (abfd) = symcount = sym - symbase;
symcount = sym - symbase;
/* Fill in the user's symbol pointer vector if needed. */
if (symptrs)
{
long l = symcount;
sym = symbase;
while (symcount-- > 0)
while (l-- > 0)
{
*symptrs++ = &sym->symbol;
sym++;
@ -2752,11 +2777,11 @@ elf_slurp_symbol_table (abfd, symptrs)
if (x_symp != NULL)
free (x_symp);
return true;
return symcount;
error_return:
if (x_symp != NULL)
free (x_symp);
return false;
return -1;
}
/* Return the number of bytes required to hold the symtab vector.
@ -2779,6 +2804,20 @@ elf_get_symtab_upper_bound (abfd)
return symtab_size;
}
long
elf_get_dynamic_symtab_upper_bound (abfd)
bfd *abfd;
{
long symcount;
long symtab_size;
Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
symcount = hdr->sh_size / sizeof (Elf_External_Sym);
symtab_size = (symcount - 1 + 1) * (sizeof (asymbol *));
return symtab_size;
}
/*
This function return the number of bytes required to store the
relocation information associated with section <<sect>>
@ -3106,10 +3145,19 @@ elf_get_symtab (abfd, alocation)
bfd *abfd;
asymbol **alocation;
{
if (!elf_slurp_symbol_table (abfd, alocation))
return -1;
long symcount = elf_slurp_symbol_table (abfd, alocation, false);
return bfd_get_symcount (abfd);
if (symcount >= 0)
bfd_get_symcount (abfd) = symcount;
return symcount;
}
long
elf_canonicalize_dynamic_symtab (abfd, alocation)
bfd *abfd;
asymbol **alocation;
{
return elf_slurp_symbol_table (abfd, alocation, true);
}
asymbol *

View file

@ -206,7 +206,9 @@ struct elf_obj_tdata
Elf_Internal_Shdr symtab_hdr;
Elf_Internal_Shdr shstrtab_hdr;
Elf_Internal_Shdr strtab_hdr;
int symtab_section, shstrtab_section, strtab_section;
Elf_Internal_Shdr dynsymtab_hdr;
Elf_Internal_Shdr dynstrtab_hdr;
int symtab_section, shstrtab_section, strtab_section, dynsymtab_section;
file_ptr next_file_pos;
void *prstatus; /* The raw /proc prstatus structure */
void *prpsinfo; /* The raw /proc prpsinfo structure */
@ -219,6 +221,7 @@ struct elf_obj_tdata
#define elf_elfsections(bfd) (elf_tdata(bfd) -> elf_sect_ptr)
#define elf_shstrtab(bfd) (elf_tdata(bfd) -> strtab_ptr)
#define elf_onesymtab(bfd) (elf_tdata(bfd) -> symtab_section)
#define elf_dynsymtab(bfd) (elf_tdata(bfd) -> dynsymtab_section)
#define elf_num_locals(bfd) (elf_tdata(bfd) -> num_locals)
#define elf_num_globals(bfd) (elf_tdata(bfd) -> num_globals)
#define elf_sym_extra(bfd) (elf_tdata(bfd) -> sym_extra)
@ -265,6 +268,8 @@ extern boolean bfd_elf32_set_section_contents PARAMS ((bfd *, sec_ptr, PTR,
extern long bfd_elf32_get_symtab_upper_bound PARAMS ((bfd *));
extern long bfd_elf32_get_symtab PARAMS ((bfd *, asymbol **));
extern long bfd_elf32_get_dynamic_symtab_upper_bound PARAMS ((bfd *));
extern long bfd_elf32_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **));
extern long bfd_elf32_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr));
extern long bfd_elf32_canonicalize_reloc PARAMS ((bfd *, sec_ptr,
arelent **, asymbol **));
@ -301,6 +306,8 @@ extern boolean bfd_elf64_set_section_contents PARAMS ((bfd *, sec_ptr, PTR,
extern long bfd_elf64_get_symtab_upper_bound PARAMS ((bfd *));
extern long bfd_elf64_get_symtab PARAMS ((bfd *, asymbol **));
extern long bfd_elf64_get_dynamic_symtab_upper_bound PARAMS ((bfd *));
extern long bfd_elf64_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **));
extern long bfd_elf64_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr));
extern long bfd_elf64_canonicalize_reloc PARAMS ((bfd *, sec_ptr,
arelent **, asymbol **));