aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1994-05-24 20:44:50 +0000
committerIan Lance Taylor <ian@airs.com>1994-05-24 20:44:50 +0000
commit5315c42827694b2d9d25cf99f238de673fbe475c (patch)
treeae7c88d0caca8b07e70c20bc34d922a9af1ad081 /bfd/elf.c
parentf49f58c6a8ffdc40d3f11ffe9e5de782ef5e0017 (diff)
downloadgdb-5315c42827694b2d9d25cf99f238de673fbe475c.zip
gdb-5315c42827694b2d9d25cf99f238de673fbe475c.tar.gz
gdb-5315c42827694b2d9d25cf99f238de673fbe475c.tar.bz2
Make MIPS ELF use new ELF backend linker. No shared library
support yet. * elf32-mips.c (bfd_mips_elf32_swap_gptab_in): New function. (bfd_mips_elf32_swap_gptab_out): New function. (mips_elf_object_p): If last symbol is LOCAL, set elf_bad_symtab. (mips_elf_final_write_processing): Set sh_info field for .gptab.* sections. (mips_elf_fake_sections): Set sh_entsize for .gptab.* sections. (mips_elf_read_ecoff_info): Read and free external symbols last, not first, for clarity. (struct mips_elf_link_hash_entry): Define new structure. (struct mips_elf_link_hash_table): Define new structure. (mips_elf_link_hash_lookup): Define new macro. (mips_elf_link_hash_traverse): Define new macro. (mips_elf_hash_table): Define new macro. (mips_elf_link_hash_newfunc): New static function. (mips_elf_link_hash_table_create): New static function. (mips_elf_add_symbol_hook): New static function. (struct extsym_info): Define new structure. (mips_elf_get_extr, mips_elf_set_index): Remove. (mips_elf_output_extsym): New static function. (gptab_compare): New static function. (mips_elf_final_link): Rewrite to use ELF backend linker, and to merge gptab information in input files. (mips_elf_relocate_hi16): New static function. (mips_elf_relocate_section): New static function. (bfd_elf32_bfd_link_hash_table_create): Define as macro before including elf32-target.h. (elf_backend_relocate_section): Likewise. (elf_backend_add_symbol_hook): Likewise. * elf.c (_bfd_elf_link_hash_newfunc): Rename from elf_link_hash_newfunc and make globally visible. Change caller. (_bfd_elf_link_hash_table_init): New function, broken out of _bfd_elf_link_hash_table_create. (_bfd_elf_link_hash_table_create): Use _bfd_elf_link_hash_table_init. * libelf.h (struct elf_obj_tdata): Add new field bad_symtab. (elf_bad_symtab): Define new accessor macro. (_bfd_elf_link_hash_newfunc): Declare. (_bew_elf_link_hash_table_init): Declare. * elfcode.h (elf_object_p): Call backend object_p hook after swapping in all the section headers. (map_program_segments): Correct typo: Internal for External. (elf_link_add_object_symbols): If elf_bad_symtab is set, read all the symbols. Skip STB_LOCAL symbols rather than giving an error. (elf_bfd_final_link): If elf_bad_symtab is set, allocate space for all symbols, not just locals. (elf_link_output_extsym): Only skip a symbol not mentioned by a regular file if it is mentioned by a dynamic object. (elf_link_input_bfd): If elf_bad_symtab is set, read all the symbols.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index b5c23db..3e1e712 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -301,15 +301,10 @@ bfd_elf_generic_reloc (abfd,
return bfd_reloc_continue;
}
-/* Generic ELF link code. */
-
-static struct bfd_hash_entry *elf_link_hash_newfunc
- PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
-
/* Create an entry in an ELF linker hash table. */
-static struct bfd_hash_entry *
-elf_link_hash_newfunc (entry, table, string)
+struct bfd_hash_entry *
+_bfd_elf_link_hash_newfunc (entry, table, string)
struct bfd_hash_entry *entry;
struct bfd_hash_table *table;
const char *string;
@@ -347,6 +342,23 @@ elf_link_hash_newfunc (entry, table, string)
return (struct bfd_hash_entry *) ret;
}
+/* Initialize an ELF linker hash table. */
+
+boolean
+_bfd_elf_link_hash_table_init (table, abfd, newfunc)
+ struct elf_link_hash_table *table;
+ bfd *abfd;
+ struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
+ struct bfd_hash_table *,
+ const char *));
+{
+ table->dynobj = NULL;
+ table->dynsymcount = 0;
+ table->dynstr = NULL;
+ table->bucketcount = 0;
+ return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
+}
+
/* Create an ELF linker hash table. */
struct bfd_link_hash_table *
@@ -362,17 +374,12 @@ _bfd_elf_link_hash_table_create (abfd)
bfd_set_error (bfd_error_no_memory);
return NULL;
}
- if (! _bfd_link_hash_table_init (&ret->root, abfd,
- elf_link_hash_newfunc))
+
+ if (! _bfd_elf_link_hash_table_init (ret, abfd, _bfd_elf_link_hash_newfunc))
{
bfd_release (abfd, ret);
return NULL;
}
- ret->dynobj = NULL;
- ret->dynsymcount = 0;
- ret->dynstr = NULL;
- ret->bucketcount = 0;
-
return &ret->root;
}