mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 22:48:57 +08:00
[AArch64] Skip IFUNC relocations in debug sections
Skip IFUNC relocations in debug sections ignored by ld.so. Fixes the following ld test failures on aarch64: FAIL: Build libpr18808.so FAIL: Build libpr18808.so_2 FAIL: Run pr18808 aborting at bfd/elfnn-aarch64.c:4986 in elf64_aarch64_final_link_relocate. bfd/ PR ld/18808 * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Skip IFUNC relocations in debug sections, change abort to _bfd_error_handler.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2017-08-17 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||||
|
|
||||||
|
PR ld/18808
|
||||||
|
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Skip IFUNC
|
||||||
|
relocations in debug sections, change abort to _bfd_error_handler.
|
||||||
|
|
||||||
2017-08-14 Nick Clifton <nickc@redhat.com>
|
2017-08-14 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR 21957
|
PR 21957
|
||||||
|
@ -4981,9 +4981,27 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
|
|||||||
const char *name;
|
const char *name;
|
||||||
bfd_vma addend = 0;
|
bfd_vma addend = 0;
|
||||||
|
|
||||||
if ((input_section->flags & SEC_ALLOC) == 0
|
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||||
|| h->plt.offset == (bfd_vma) -1)
|
{
|
||||||
abort ();
|
/* Dynamic relocs are not propagated for SEC_DEBUGGING
|
||||||
|
sections because such sections are not SEC_ALLOC and
|
||||||
|
thus ld.so will not process them. */
|
||||||
|
if ((input_section->flags & SEC_DEBUGGING) != 0)
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
if (h->root.root.string)
|
||||||
|
name = h->root.root.string;
|
||||||
|
else
|
||||||
|
name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, NULL);
|
||||||
|
_bfd_error_handler
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
|
||||||
|
input_bfd, input_section, rel->r_offset, howto->name, name);
|
||||||
|
bfd_set_error (bfd_error_bad_value);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else if (h->plt.offset == (bfd_vma) -1)
|
||||||
|
goto bad_ifunc_reloc;
|
||||||
|
|
||||||
/* STT_GNU_IFUNC symbol must go through PLT. */
|
/* STT_GNU_IFUNC symbol must go through PLT. */
|
||||||
plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
|
plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
|
||||||
@ -4992,6 +5010,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
|
|||||||
switch (bfd_r_type)
|
switch (bfd_r_type)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
|
bad_ifunc_reloc:
|
||||||
if (h->root.root.string)
|
if (h->root.root.string)
|
||||||
name = h->root.root.string;
|
name = h->root.root.string;
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user