mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 01:28:46 +00:00
64-bit MIPS ELF ABI objdump support:
* elf64-mips.c: New file. * Makefile.in: Rebuild dependencies. (BFD64_BACKENDS): Add elf64-mips.o. (BFD64_BACKENDS_CFILES): Add elf64-mips.c. * config.bfd (mips*el-*-elf*) Add bfd_elf64_bigmips_vec and bfd_elf64_littlemips_vec to targ_selvecs. (mips*-*-elf*): Likewise. * confingure.in: Add bfd_elf64_bigmips_vec and bfd_elf64_littlemips_vec to vector switch. * configure: Rebuild. * elf32-mips.c (_bfd_mips_elf_section_from_shdr): New function, broken out of mips_elf_section_from_shdr. (mips_elf32_section_from_shdr): Rename from mips_elf_section_from_shdr. Call new function. (elf_backend_section_from_shdr): Update name of renamed function. * elf-bfd.h (struct elf_size_info): Change second parameter of write_out_phdrs to be const. Likewise for second parameter of swap_symbol_out. (struct bfd_elf_section_data): Add rel_hdr2 field. (bfd_elf32_swap_symbol_in): Change second parameter to be const. (bfd_elf32_swap_symbol_out): Likewise. (bfd_elf32_swap_reloc_in): Likewise. (bfd_elf32_swap_reloc_out): Likewise. (bfd_elf32_swap_reloca_in): Likewise. (bfd_elf32_swap_reloca_out): Likewise. (bfd_elf32_swap_phdr_in): Likewise. (bfd_elf32_swap_phdr_out): Likewise. (bfd_elf32_swap_dyn_in): Likewise. (bfd_elf32_swap_dyn_out): Likewise. (bfd_elf32_slurp_symbol_table): Declare. (bfd_elf32_write_shdrs_and_ehdr): Declare. (bfd_elf32_write_out_phdrs): Declare. (bfd_elf64_swap_symbol_in): Change second parameter to be const. (bfd_elf64_swap_symbol_out): Likewise. (bfd_elf64_swap_reloc_in): Likewise. (bfd_elf64_swap_reloc_out): Likewise. (bfd_elf64_swap_reloca_in): Likewise. (bfd_elf64_swap_reloca_out): Likewise. (bfd_elf64_swap_phdr_in): Likewise. (bfd_elf64_swap_phdr_out): Likewise. (bfd_elf64_swap_dyn_in): Likewise. (bfd_elf64_swap_dyn_out): Likewise. (bfd_elf64_slurp_symbol_table): Declare. (bfd_elf64_write_shdrs_and_ehdr): Declare. (bfd_elf64_write_out_phdrs): Declare. (_bfd_mips_elf_section_from_shdr): Declare. * elf.c (bfd_section_from_shdr): Remove assertion requiring SHT_REL/SHT_RELA to match use_rela_p. If there is already a reloc section for the section, add the new one to rel_hdr2. Increment reloc_count rather than setting it. * elfcode.h (elf_slurp_symbol_table): Define name as macro. Remove static declaration. (elf_write_shdrs_and_ehdr): Define name as macro. (elf_write_out_phdrs): Likewise. (elf_swap_ehdr_in, elf_swap_ehdr_out): Declare. (elf_swap_shdr_in, elf_swap_shdr_out): Declare. (elf_swap_symbol_in): Change second parameter to be const. (elf_swap_symbol_out): Likewise. (elf_swap_ehdr_in, elf_swap_ehdr_out): Likewise. (elf_swap_shdr_in, elf_swap_shdr_out): Likewise. (elf_swap_phdr_in, elf_swap_phdr_out): Likewise. (elf_swap_reloc_in, elf_swap_reloc_out): Likewise. (elf_swap_reloca_in, elf_swap_reloca_out): Likewise. (elf_write_out_phdrs): Rename from write_out_phdrs. Change second parameter to be const. Make non-static. (elf_write_shdrs_and_ehdr): Rename from write_shdrs_and_ehdr. Make non-static. (elf_slurp_symbol_table): Make non-static. (NAME(_bfd_elf,size_info)): Update names of renamed functions. * elfxx-target.h (elf_info_to_howto): Define if not defined. (elf_backend_size_info): Likewise. (elfNN_bed): Use elf_backend_size_info. * targets.c (bfd_elf64_bigmips_vec): Declare. (bfd_elf64_littlemips_vec): Declare. (bfd_target_vector): Add bfd_elf64_bigmips_vec and bfd_elf64_littlemips_vec if BFD64 is defined.
This commit is contained in:
28
bfd/elf.c
28
bfd/elf.c
@@ -584,6 +584,7 @@ _bfd_elf_link_hash_table_init (table, abfd, newfunc)
|
||||
table->bucketcount = 0;
|
||||
table->needed = NULL;
|
||||
table->hgot = NULL;
|
||||
table->stab_info = NULL;
|
||||
return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
|
||||
}
|
||||
|
||||
@@ -800,7 +801,6 @@ bfd_section_from_shdr (abfd, shindex)
|
||||
{
|
||||
asection *target_sect;
|
||||
Elf_Internal_Shdr *hdr2;
|
||||
int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
|
||||
|
||||
/* For some incomprehensible reason Oracle distributes
|
||||
libraries for Solaris in which some of the objects have
|
||||
@@ -845,30 +845,24 @@ bfd_section_from_shdr (abfd, shindex)
|
||||
if (hdr->sh_link != elf_onesymtab (abfd))
|
||||
return _bfd_elf_make_section_from_shdr (abfd, hdr, name);
|
||||
|
||||
/* Don't allow REL relocations on a machine that uses RELA and
|
||||
vice versa. */
|
||||
/* @@ Actually, the generic ABI does suggest that both might be
|
||||
used in one file. But the four ABI Processor Supplements I
|
||||
have access to right now all specify that only one is used on
|
||||
each of those architectures. It's conceivable that, e.g., a
|
||||
bunch of absolute 32-bit relocs might be more compact in REL
|
||||
form even on a RELA machine... */
|
||||
BFD_ASSERT (use_rela_p
|
||||
? (hdr->sh_type == SHT_RELA
|
||||
&& hdr->sh_entsize == bed->s->sizeof_rela)
|
||||
: (hdr->sh_type == SHT_REL
|
||||
&& hdr->sh_entsize == bed->s->sizeof_rel));
|
||||
|
||||
if (! bfd_section_from_shdr (abfd, hdr->sh_info))
|
||||
return false;
|
||||
target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
|
||||
if (target_sect == NULL)
|
||||
return false;
|
||||
|
||||
hdr2 = &elf_section_data (target_sect)->rel_hdr;
|
||||
if ((target_sect->flags & SEC_RELOC) == 0
|
||||
|| target_sect->reloc_count == 0)
|
||||
hdr2 = &elf_section_data (target_sect)->rel_hdr;
|
||||
else
|
||||
{
|
||||
BFD_ASSERT (elf_section_data (target_sect)->rel_hdr2 == NULL);
|
||||
hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, sizeof (*hdr2));
|
||||
elf_section_data (target_sect)->rel_hdr2 = hdr2;
|
||||
}
|
||||
*hdr2 = *hdr;
|
||||
elf_elfsections (abfd)[shindex] = hdr2;
|
||||
target_sect->reloc_count = hdr->sh_size / hdr->sh_entsize;
|
||||
target_sect->reloc_count += hdr->sh_size / hdr->sh_entsize;
|
||||
target_sect->flags |= SEC_RELOC;
|
||||
target_sect->relocation = NULL;
|
||||
target_sect->rel_filepos = hdr->sh_offset;
|
||||
|
||||
Reference in New Issue
Block a user