diff options
author | Ian Lance Taylor <ian@airs.com> | 1994-05-24 20:44:50 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1994-05-24 20:44:50 +0000 |
commit | 5315c42827694b2d9d25cf99f238de673fbe475c (patch) | |
tree | ae7c88d0caca8b07e70c20bc34d922a9af1ad081 /bfd/elf.c | |
parent | f49f58c6a8ffdc40d3f11ffe9e5de782ef5e0017 (diff) | |
download | gdb-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.c | 35 |
1 files changed, 21 insertions, 14 deletions
@@ -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; } |