From: Alan Modra Date: Thu, 15 Dec 2016 10:59:44 +0000 (+1030) Subject: Linking non-ELF file broken by PR20908 fix X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a961cdd5f139d3c3e09170db52bd8df7dafae13f;p=binutils-gdb.git Linking non-ELF file broken by PR20908 fix PR ld/20968 PR ld/20908 * elflink.c (bfd_elf_final_link): Revert 2016-12-02 change. Move reloc counting code later after ELF flavour test. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ded152e47dd..46cb3834dd5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2016-12-15 Alan Modra + + PR ld/20968 + PR ld/20908 + * elflink.c (bfd_elf_final_link): Revert 2016-12-02 change. Move + reloc counting code later after ELF flavour test. + 2016-12-14 Maciej W. Rozycki * bfd-in.h (elf_internal_abiflags_v0): New struct declaration. diff --git a/bfd/elflink.c b/bfd/elflink.c index 9b4482d952d..fe6662d0dd7 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -11345,13 +11345,6 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) asection *sec; sec = p->u.indirect.section; - /* See PR 20908 for a reproducer. */ - if (bfd_get_flavour (sec->owner) != bfd_target_elf_flavour) - { - _bfd_error_handler (_("%B: not in ELF format"), sec->owner); - goto error_return; - } - esdi = elf_section_data (sec); /* Mark all sections which are to be included in the link. This will normally be every section. We need @@ -11362,37 +11355,18 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) if (sec->flags & SEC_MERGE) merged = TRUE; - if (esdo->this_hdr.sh_type == SHT_REL - || esdo->this_hdr.sh_type == SHT_RELA) - /* Some backends use reloc_count in relocation sections - to count particular types of relocs. Of course, - reloc sections themselves can't have relocations. */ - reloc_count = 0; - else if (emit_relocs) - { - reloc_count = sec->reloc_count; - if (bed->elf_backend_count_additional_relocs) - { - int c; - c = (*bed->elf_backend_count_additional_relocs) (sec); - additional_reloc_count += c; - } - } - else if (bed->elf_backend_count_relocs) - reloc_count = (*bed->elf_backend_count_relocs) (info, sec); - if (sec->rawsize > max_contents_size) max_contents_size = sec->rawsize; if (sec->size > max_contents_size) max_contents_size = sec->size; - /* We are interested in just local symbols, not all - symbols. */ if (bfd_get_flavour (sec->owner) == bfd_target_elf_flavour && (sec->owner->flags & DYNAMIC) == 0) { size_t sym_count; + /* We are interested in just local symbols, not all + symbols. */ if (elf_bad_symtab (sec->owner)) sym_count = (elf_tdata (sec->owner)->symtab_hdr.sh_size / bed->s->sizeof_sym); @@ -11406,6 +11380,27 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) && elf_symtab_shndx_list (sec->owner) != NULL) max_sym_shndx_count = sym_count; + if (esdo->this_hdr.sh_type == SHT_REL + || esdo->this_hdr.sh_type == SHT_RELA) + /* Some backends use reloc_count in relocation sections + to count particular types of relocs. Of course, + reloc sections themselves can't have relocations. */ + ; + else if (emit_relocs) + { + reloc_count = sec->reloc_count; + if (bed->elf_backend_count_additional_relocs) + { + int c; + c = (*bed->elf_backend_count_additional_relocs) (sec); + additional_reloc_count += c; + } + } + else if (bed->elf_backend_count_relocs) + reloc_count = (*bed->elf_backend_count_relocs) (info, sec); + + esdi = elf_section_data (sec); + if ((sec->flags & SEC_RELOC) != 0) { size_t ext_size = 0;