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.
This commit is contained in:
Alan Modra 2017-10-28 14:10:55 +10:30
parent bac608e7e1
commit c0e331c794
5 changed files with 11 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2017-10-28 Alan Modra <amodra@gmail.com>
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 <amodra@gmail.com> 2017-10-25 Alan Modra <amodra@gmail.com>
* archive.c (_bfd_compute_and_write_armap): Match "__gnu_lto_slim" * archive.c (_bfd_compute_and_write_armap): Match "__gnu_lto_slim"

View File

@ -4498,6 +4498,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_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
#define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
#define elf_backend_check_relocs elf32_hppa_check_relocs #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_create_dynamic_sections elf32_hppa_create_dynamic_sections
#define elf_backend_fake_sections elf_hppa_fake_sections #define elf_backend_fake_sections elf_hppa_fake_sections
#define elf_backend_relocate_section elf32_hppa_relocate_section #define elf_backend_relocate_section elf32_hppa_relocate_section

View File

@ -10778,6 +10778,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
#define elf_backend_relocate_section ppc_elf_relocate_section #define elf_backend_relocate_section ppc_elf_relocate_section
#define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections #define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections
#define elf_backend_check_relocs ppc_elf_check_relocs #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_copy_indirect_symbol ppc_elf_copy_indirect_symbol
#define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol #define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol
#define elf_backend_add_symbol_hook ppc_elf_add_symbol_hook #define elf_backend_add_symbol_hook ppc_elf_add_symbol_hook

View File

@ -101,6 +101,7 @@ static bfd_vma opd_entry_value
#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed #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_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
#define elf_backend_check_relocs ppc64_elf_check_relocs #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_keep ppc64_elf_gc_keep
#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook

View File

@ -1162,11 +1162,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
if (pold_weak) if (pold_weak)
*pold_weak = oldweak; *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 /* We have to check it for every instance since the first few may be
references and not all compilers emit symbol type for undefined references and not all compilers emit symbol type for undefined
symbols. */ symbols. */