From: Alan Modra Date: Sat, 28 Oct 2017 03:40:55 +0000 (+1030) Subject: PR22300, Abort in elf32_hppa_relocate_section building polyml X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1dac3b4518f811cc124df2040db3c5a0e9049bb3;p=thirdparty%2Fbinutils-gdb.git PR22300, Abort in elf32_hppa_relocate_section building polyml polyml produces object files with the wrong OS/ABI for hppa-linux. This, along with the fact that elf32-hppa.c is using the strictest backend relocs_compatible, results in wrong merging of ELF symbols. So, remove the relocs_compatible check in _bfd_elf_merge_symbol. _bfd_elf_merge_symbol is only called nowadays from within blocks protected by is_elf_hash_table, so "we are doing an ELF link" as the removed comment says, is true. Also relax relocs_compatible for hppa and powerpc. relocs_compatible is used for more than just merging symbols, as the name suggests. This allows objects that are in fact reasonably compatible to be linked. PR 22300 * elflink.c (_bfd_elf_merge_symbol): Remove relocs_compatible check. * elf32-hppa.c (elf_backend_relocs_compatible): Define. * elf32-ppc.c (elf_backend_relocs_compatible): Define. * elf64-ppc.c (elf_backend_relocs_compatible): Define. (cherry picked from commit c0e331c794d6bd75d9be9bea6145513074c33f39) --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 320e3f5ff75..ea035e76ff4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,13 @@ 2017-11-01 Alan Modra Apply from master + 2017-10-28 Alan Modra + PR 22300 + * elflink.c (_bfd_elf_merge_symbol): Remove relocs_compatible check. + * elf32-hppa.c (elf_backend_relocs_compatible): Define. + * elf32-ppc.c (elf_backend_relocs_compatible): Define. + * elf64-ppc.c (elf_backend_relocs_compatible): Define. + 2017-10-25 Alan Modra * archive.c (_bfd_compute_and_write_armap): Match "__gnu_lto_slim" optionally prefixed with "_". diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 548d656776a..62a689ae5e5 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -4615,6 +4615,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type) #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol #define elf_backend_check_relocs elf32_hppa_check_relocs +#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible #define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections #define elf_backend_fake_sections elf_hppa_fake_sections #define elf_backend_relocate_section elf32_hppa_relocate_section diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index f9a32c2e874..3f42f2a4d8e 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -10931,6 +10931,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, #define elf_backend_relocate_section ppc_elf_relocate_section #define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections #define elf_backend_check_relocs ppc_elf_check_relocs +#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible #define elf_backend_copy_indirect_symbol ppc_elf_copy_indirect_symbol #define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol #define elf_backend_add_symbol_hook ppc_elf_add_symbol_hook diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 277bb0ef5d2..3c8e2865d79 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -101,6 +101,7 @@ static bfd_vma opd_entry_value #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup #define elf_backend_check_relocs ppc64_elf_check_relocs +#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible #define elf_backend_gc_keep ppc64_elf_gc_keep #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook diff --git a/bfd/elflink.c b/bfd/elflink.c index 39d878c8146..245d89c6f4f 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -1161,11 +1161,6 @@ _bfd_elf_merge_symbol (bfd *abfd, if (pold_weak) *pold_weak = oldweak; - /* This code is for coping with dynamic objects, and is only useful - if we are doing an ELF link. */ - if (!(*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec)) - return TRUE; - /* We have to check it for every instance since the first few may be references and not all compilers emit symbol type for undefined symbols. */