From afd9acee15d55fccf2a25b72c99303f7cbaaa1c2 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 29 Apr 2016 04:29:38 -0700 Subject: [PATCH] X86-64: Set check_relocs_failed on error When checking relocations, set check_relocs_failed on error. * elf64-x86-64.c (elf_x86_64_check_relocs): Set check_relocs_failed on error. --- bfd/ChangeLog | 5 +++++ bfd/elf64-x86-64.c | 41 ++++++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f60ee034c38..23d7f68264c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2016-04-29 H.J. Lu + + * elf64-x86-64.c (elf_x86_64_check_relocs): Set + check_relocs_failed on error. + 2016-04-29 Nick Clifton PR 19938 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 8a5ce750914..e87a1e00ac0 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1663,7 +1663,10 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, htab = elf_x86_64_hash_table (info); if (htab == NULL) - return FALSE; + { + sec->check_relocs_failed = 1; + return FALSE; + } use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed; @@ -1690,7 +1693,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, { (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd, r_symndx); - return FALSE; + goto error_return; } if (r_symndx < symtab_hdr->sh_info) @@ -1699,7 +1702,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx); if (isym == NULL) - return FALSE; + goto error_return; /* Check relocation against local STT_GNU_IFUNC symbol. */ if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) @@ -1707,7 +1710,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, TRUE); if (h == NULL) - return FALSE; + goto error_return; /* Fake a STT_GNU_IFUNC symbol. */ h->type = STT_GNU_IFUNC; @@ -1755,7 +1758,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, "supported in x32 mode"), abfd, x86_64_elf_howto_table[r_type].name, name); bfd_set_error (bfd_error_bad_value); - return FALSE; + goto error_return; } break; } @@ -1808,7 +1811,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, || !bfd_set_section_alignment (htab->elf.dynobj, htab->plt_bnd, plt_bnd_align)) - return FALSE; + goto error_return; } } @@ -1824,7 +1827,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, if (h->type == STT_GNU_IFUNC && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info)) - return FALSE; + goto error_return; break; } @@ -1841,7 +1844,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, symtab_hdr, sym_hashes, &r_type, GOT_UNKNOWN, rel, rel_end, h, r_symndx)) - return FALSE; + goto error_return; eh = (struct elf_x86_64_link_hash_entry *) h; switch (r_type) @@ -1908,7 +1911,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, local_got_refcounts = ((bfd_signed_vma *) bfd_zalloc (abfd, size)); if (local_got_refcounts == NULL) - return FALSE; + goto error_return; elf_local_got_refcounts (abfd) = local_got_refcounts; elf_x86_64_local_tlsdesc_gotent (abfd) = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info); @@ -1942,7 +1945,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, (_("%B: '%s' accessed both as normal and thread local symbol"), abfd, name); bfd_set_error (bfd_error_bad_value); - return FALSE; + goto error_return; } } @@ -1968,7 +1971,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, htab->elf.dynobj = abfd; if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) - return FALSE; + goto error_return; } break; @@ -2136,7 +2139,7 @@ do_size: abfd, /*rela?*/ TRUE); if (sreloc == NULL) - return FALSE; + goto error_return; } /* If this is a global symbol, we count the number of @@ -2154,7 +2157,7 @@ do_size: isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx); if (isym == NULL) - return FALSE; + goto error_return; s = bfd_section_from_elf_index (abfd, isym->st_shndx); if (s == NULL) @@ -2174,7 +2177,7 @@ do_size: p = ((struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj, amt)); if (p == NULL) - return FALSE; + goto error_return; p->next = *head; *head = p; p->sec = sec; @@ -2193,7 +2196,7 @@ do_size: Reconstruct it for later use during GC. */ case R_X86_64_GNU_VTINHERIT: if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) - return FALSE; + goto error_return; break; /* This relocation describes which C++ vtable entries are actually @@ -2202,7 +2205,7 @@ do_size: BFD_ASSERT (h != NULL); if (h != NULL && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) - return FALSE; + goto error_return; break; default: @@ -2240,7 +2243,7 @@ do_size: || !bfd_set_section_alignment (htab->elf.dynobj, htab->plt_got, plt_got_align)) - return FALSE; + goto error_return; } if ((r_type == R_X86_64_GOTPCREL @@ -2251,6 +2254,10 @@ do_size: } return TRUE; + +error_return: + sec->check_relocs_failed = 1; + return FALSE; } /* Return the section that should be marked against GC for a given -- 2.30.2