From fe53b4a4c47df9c0bb2fa7f0de5a241f21cf352c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 2 Sep 2017 07:23:46 -0700 Subject: x86: Add is_x86_elf Share is_x86_elf in elf32-i386.c and elf64-x86-64.c. * elf32-i386.c (is_i386_elf): Removed. (elf_i386_check_relocs): Replace is_i386_elf with is_x86_elf. (elf_i386_size_dynamic_sections): Likewise. (elf_i386_relocate_section): Likewise. * elf64-x86-64.c (is_x86_64_elf): Removed. (elf_x86_64_check_relocs): Replace is_x86_64_elf with is_x86_elf. (elf_x86_64_size_dynamic_sections): Likewise. (elf_x86_64_relocate_section): Likewise. * elfxx-x86.c (_bfd_x86_elf_link_hash_table_create): Initialize target_id. * elfxx-x86.h (elf_x86_link_hash_table): Add target_id. (is_x86_elf): New. --- bfd/ChangeLog | 16 ++++++++++++++++ bfd/elf32-i386.c | 16 ++++++---------- bfd/elf64-x86-64.c | 16 ++++++---------- bfd/elfxx-x86.c | 1 + bfd/elfxx-x86.h | 6 ++++++ 5 files changed, 35 insertions(+), 20 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index efee054..5830e42 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,21 @@ 2017-09-02 H.J. Lu + * elf32-i386.c (is_i386_elf): Removed. + (elf_i386_check_relocs): Replace is_i386_elf with is_x86_elf. + (elf_i386_size_dynamic_sections): Likewise. + (elf_i386_relocate_section): Likewise. + * elf64-x86-64.c (is_x86_64_elf): Removed. + (elf_x86_64_check_relocs): Replace is_x86_64_elf with + is_x86_elf. + (elf_x86_64_size_dynamic_sections): Likewise. + (elf_x86_64_relocate_section): Likewise. + * elfxx-x86.c (_bfd_x86_elf_link_hash_table_create): Initialize + target_id. + * elfxx-x86.h (elf_x86_link_hash_table): Add target_id. + (is_x86_elf): New. + +2017-09-02 H.J. Lu + * elf32-i386.c (elf_i386_compute_jump_table_size): Removed. (elf_i386_allocate_dynrelocs): Replace elf_i386_compute_jump_table_size with diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 573a8ed..bc2b219 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -853,11 +853,6 @@ static const struct elf_i386_backend_data elf_i386_arch_bed = #define elf_backend_arch_data &elf_i386_arch_bed -#define is_i386_elf(bfd) \ - (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ - && elf_tdata (bfd) != NULL \ - && elf_object_id (bfd) == I386_ELF_DATA) - /* Return TRUE if the TLS access code sequence support transition from R_TYPE. */ @@ -1487,8 +1482,6 @@ elf_i386_check_relocs (bfd *abfd, if ((sec->flags & SEC_ALLOC) == 0) return TRUE; - BFD_ASSERT (is_i386_elf (abfd)); - htab = elf_x86_hash_table (info, I386_ELF_DATA); if (htab == NULL) { @@ -1496,6 +1489,8 @@ elf_i386_check_relocs (bfd *abfd, return FALSE; } + BFD_ASSERT (is_x86_elf (abfd, htab)); + /* Get the section contents. */ if (elf_section_data (sec)->this_hdr.contents != NULL) contents = elf_section_data (sec)->this_hdr.contents; @@ -2566,7 +2561,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) Elf_Internal_Shdr *symtab_hdr; asection *srel; - if (! is_i386_elf (ibfd)) + if (! is_x86_elf (ibfd, htab)) continue; for (s = ibfd->sections; s != NULL; s = s->next) @@ -3005,8 +3000,6 @@ elf_i386_relocate_section (bfd *output_bfd, bfd_boolean is_vxworks_tls; unsigned plt_entry_size; - BFD_ASSERT (is_i386_elf (input_bfd)); - /* Skip if check_relocs failed. */ if (input_section->check_relocs_failed) return FALSE; @@ -3014,6 +3007,9 @@ elf_i386_relocate_section (bfd *output_bfd, htab = elf_x86_hash_table (info, I386_ELF_DATA); if (htab == NULL) return FALSE; + + BFD_ASSERT (is_x86_elf (input_bfd, htab)); + symtab_hdr = &elf_symtab_hdr (input_bfd); sym_hashes = elf_sym_hashes (input_bfd); local_got_offsets = elf_local_got_offsets (input_bfd); diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index dcebd68..7a6e1f1 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -968,11 +968,6 @@ static const struct elf_x86_64_backend_data elf_x86_64_arch_bed = #define elf_backend_arch_data &elf_x86_64_arch_bed -#define is_x86_64_elf(bfd) \ - (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ - && elf_tdata (bfd) != NULL \ - && elf_object_id (bfd) == X86_64_ELF_DATA) - static bfd_boolean elf64_x86_64_elf_object_p (bfd *abfd) { @@ -1877,8 +1872,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, if ((sec->flags & SEC_ALLOC) == 0) return TRUE; - BFD_ASSERT (is_x86_64_elf (abfd)); - htab = elf_x86_hash_table (info, X86_64_ELF_DATA); if (htab == NULL) { @@ -1886,6 +1879,8 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, return FALSE; } + BFD_ASSERT (is_x86_elf (abfd, htab)); + /* Get the section contents. */ if (elf_section_data (sec)->this_hdr.contents != NULL) contents = elf_section_data (sec)->this_hdr.contents; @@ -2971,7 +2966,7 @@ elf_x86_64_size_dynamic_sections (bfd *output_bfd, Elf_Internal_Shdr *symtab_hdr; asection *srel; - if (! is_x86_64_elf (ibfd)) + if (! is_x86_elf (ibfd, htab)) continue; for (s = ibfd->sections; s != NULL; s = s->next) @@ -3395,8 +3390,6 @@ elf_x86_64_relocate_section (bfd *output_bfd, Elf_Internal_Rela *relend; unsigned int plt_entry_size; - BFD_ASSERT (is_x86_64_elf (input_bfd)); - /* Skip if check_relocs failed. */ if (input_section->check_relocs_failed) return FALSE; @@ -3404,6 +3397,9 @@ elf_x86_64_relocate_section (bfd *output_bfd, htab = elf_x86_hash_table (info, X86_64_ELF_DATA); if (htab == NULL) return FALSE; + + BFD_ASSERT (is_x86_elf (input_bfd, htab)); + plt_entry_size = htab->plt.plt_entry_size; symtab_hdr = &elf_symtab_hdr (input_bfd); sym_hashes = elf_sym_hashes (input_bfd); diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 6b7c119..b3d241c 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -310,6 +310,7 @@ _bfd_x86_elf_link_hash_table_create (bfd *abfd) ret->tls_get_addr = "___tls_get_addr"; } } + ret->target_id = bed->target_id; ret->loc_hash_table = htab_try_create (1024, _bfd_x86_elf_local_htab_hash, diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index a95b5c6..e383135 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -313,6 +313,7 @@ struct elf_x86_link_hash_table bfd_vma (*r_info) (bfd_vma, bfd_vma); bfd_vma (*r_sym) (bfd_vma); + enum elf_target_id target_id; unsigned int sizeof_reloc; unsigned int got_entry_size; unsigned int pointer_r_type; @@ -386,6 +387,11 @@ struct elf_x86_plt #define elf_x86_compute_jump_table_size(htab) \ ((htab)->elf.srelplt->reloc_count * (htab)->got_entry_size) +#define is_x86_elf(bfd, htab) \ + (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ + && elf_tdata (bfd) != NULL \ + && elf_object_id (bfd) == (htab)->target_id) + extern bfd_boolean _bfd_x86_elf_mkobject (bfd *); -- cgit v1.1