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.
This commit is contained in:
parent
5522f910cb
commit
afd9acee15
2 changed files with 29 additions and 17 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2016-04-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* elf64-x86-64.c (elf_x86_64_check_relocs): Set
|
||||||
|
check_relocs_failed on error.
|
||||||
|
|
||||||
2016-04-29 Nick Clifton <nickc@redhat.com>
|
2016-04-29 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR 19938
|
PR 19938
|
||||||
|
|
|
@ -1663,7 +1663,10 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
|
|
||||||
htab = elf_x86_64_hash_table (info);
|
htab = elf_x86_64_hash_table (info);
|
||||||
if (htab == NULL)
|
if (htab == NULL)
|
||||||
|
{
|
||||||
|
sec->check_relocs_failed = 1;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed;
|
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"),
|
(*_bfd_error_handler) (_("%B: bad symbol index: %d"),
|
||||||
abfd, r_symndx);
|
abfd, r_symndx);
|
||||||
return FALSE;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r_symndx < symtab_hdr->sh_info)
|
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,
|
isym = bfd_sym_from_r_symndx (&htab->sym_cache,
|
||||||
abfd, r_symndx);
|
abfd, r_symndx);
|
||||||
if (isym == NULL)
|
if (isym == NULL)
|
||||||
return FALSE;
|
goto error_return;
|
||||||
|
|
||||||
/* Check relocation against local STT_GNU_IFUNC symbol. */
|
/* Check relocation against local STT_GNU_IFUNC symbol. */
|
||||||
if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
|
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,
|
h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (h == NULL)
|
if (h == NULL)
|
||||||
return FALSE;
|
goto error_return;
|
||||||
|
|
||||||
/* Fake a STT_GNU_IFUNC symbol. */
|
/* Fake a STT_GNU_IFUNC symbol. */
|
||||||
h->type = STT_GNU_IFUNC;
|
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,
|
"supported in x32 mode"), abfd,
|
||||||
x86_64_elf_howto_table[r_type].name, name);
|
x86_64_elf_howto_table[r_type].name, name);
|
||||||
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
||||||
return FALSE;
|
goto error_return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1808,7 +1811,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
|| !bfd_set_section_alignment (htab->elf.dynobj,
|
|| !bfd_set_section_alignment (htab->elf.dynobj,
|
||||||
htab->plt_bnd,
|
htab->plt_bnd,
|
||||||
plt_bnd_align))
|
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
|
if (h->type == STT_GNU_IFUNC
|
||||||
&& !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
|
&& !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
|
||||||
info))
|
info))
|
||||||
return FALSE;
|
goto error_return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1841,7 +1844,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
symtab_hdr, sym_hashes,
|
symtab_hdr, sym_hashes,
|
||||||
&r_type, GOT_UNKNOWN,
|
&r_type, GOT_UNKNOWN,
|
||||||
rel, rel_end, h, r_symndx))
|
rel, rel_end, h, r_symndx))
|
||||||
return FALSE;
|
goto error_return;
|
||||||
|
|
||||||
eh = (struct elf_x86_64_link_hash_entry *) h;
|
eh = (struct elf_x86_64_link_hash_entry *) h;
|
||||||
switch (r_type)
|
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 *)
|
local_got_refcounts = ((bfd_signed_vma *)
|
||||||
bfd_zalloc (abfd, size));
|
bfd_zalloc (abfd, size));
|
||||||
if (local_got_refcounts == NULL)
|
if (local_got_refcounts == NULL)
|
||||||
return FALSE;
|
goto error_return;
|
||||||
elf_local_got_refcounts (abfd) = local_got_refcounts;
|
elf_local_got_refcounts (abfd) = local_got_refcounts;
|
||||||
elf_x86_64_local_tlsdesc_gotent (abfd)
|
elf_x86_64_local_tlsdesc_gotent (abfd)
|
||||||
= (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
|
= (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"),
|
(_("%B: '%s' accessed both as normal and thread local symbol"),
|
||||||
abfd, name);
|
abfd, name);
|
||||||
bfd_set_error (bfd_error_bad_value);
|
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;
|
htab->elf.dynobj = abfd;
|
||||||
if (!_bfd_elf_create_got_section (htab->elf.dynobj,
|
if (!_bfd_elf_create_got_section (htab->elf.dynobj,
|
||||||
info))
|
info))
|
||||||
return FALSE;
|
goto error_return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2136,7 +2139,7 @@ do_size:
|
||||||
abfd, /*rela?*/ TRUE);
|
abfd, /*rela?*/ TRUE);
|
||||||
|
|
||||||
if (sreloc == NULL)
|
if (sreloc == NULL)
|
||||||
return FALSE;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this is a global symbol, we count the number of
|
/* 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,
|
isym = bfd_sym_from_r_symndx (&htab->sym_cache,
|
||||||
abfd, r_symndx);
|
abfd, r_symndx);
|
||||||
if (isym == NULL)
|
if (isym == NULL)
|
||||||
return FALSE;
|
goto error_return;
|
||||||
|
|
||||||
s = bfd_section_from_elf_index (abfd, isym->st_shndx);
|
s = bfd_section_from_elf_index (abfd, isym->st_shndx);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
|
@ -2174,7 +2177,7 @@ do_size:
|
||||||
p = ((struct elf_dyn_relocs *)
|
p = ((struct elf_dyn_relocs *)
|
||||||
bfd_alloc (htab->elf.dynobj, amt));
|
bfd_alloc (htab->elf.dynobj, amt));
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
return FALSE;
|
goto error_return;
|
||||||
p->next = *head;
|
p->next = *head;
|
||||||
*head = p;
|
*head = p;
|
||||||
p->sec = sec;
|
p->sec = sec;
|
||||||
|
@ -2193,7 +2196,7 @@ do_size:
|
||||||
Reconstruct it for later use during GC. */
|
Reconstruct it for later use during GC. */
|
||||||
case R_X86_64_GNU_VTINHERIT:
|
case R_X86_64_GNU_VTINHERIT:
|
||||||
if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
|
if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
|
||||||
return FALSE;
|
goto error_return;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* This relocation describes which C++ vtable entries are actually
|
/* This relocation describes which C++ vtable entries are actually
|
||||||
|
@ -2202,7 +2205,7 @@ do_size:
|
||||||
BFD_ASSERT (h != NULL);
|
BFD_ASSERT (h != NULL);
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
|
&& !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
|
||||||
return FALSE;
|
goto error_return;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2240,7 +2243,7 @@ do_size:
|
||||||
|| !bfd_set_section_alignment (htab->elf.dynobj,
|
|| !bfd_set_section_alignment (htab->elf.dynobj,
|
||||||
htab->plt_got,
|
htab->plt_got,
|
||||||
plt_got_align))
|
plt_got_align))
|
||||||
return FALSE;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((r_type == R_X86_64_GOTPCREL
|
if ((r_type == R_X86_64_GOTPCREL
|
||||||
|
@ -2251,6 +2254,10 @@ do_size:
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
error_return:
|
||||||
|
sec->check_relocs_failed = 1;
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the section that should be marked against GC for a given
|
/* Return the section that should be marked against GC for a given
|
||||||
|
|
Loading…
Reference in a new issue