X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-arm.c;h=02d43a86195bd527fec24c845c2e925bc5a45346;hb=7c1f42273567c30e17e1363897ce5c6d0764c643;hp=e9d93cc3b860b43919a1ca8236f4721bf60fad66;hpb=dc1e8a474f904419abaa27da4be5b0f735a87255;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index e9d93cc3b8..02d43a8619 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -2453,8 +2453,8 @@ static const bfd_vma elf32_thumb2_plt_entry [] = 0x0c00f240, /* movw ip, #0xNNNN */ 0x0c00f2c0, /* movt ip, #0xNNNN */ 0xf8dc44fc, /* add ip, pc */ - 0xe7fdf000 /* ldr.w pc, [ip] */ - /* b .-2 */ + 0xe7fcf000 /* ldr.w pc, [ip] */ + /* b .-4 */ }; /* The format of the first entry in the procedure linkage table @@ -5064,6 +5064,14 @@ arm_build_one_stub (struct bfd_hash_entry *gen_entry, stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry; info = (struct bfd_link_info *) in_arg; + /* Fail if the target section could not be assigned to an output + section. The user should fix his linker script. */ + if (stub_entry->target_section->output_section == NULL + && info->non_contiguous_regions) + info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. " + "Retry without --enable-non-contiguous-regions.\n"), + stub_entry->target_section); + globals = elf32_arm_hash_table (info); if (globals == NULL) return FALSE; @@ -9993,6 +10001,12 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info, rel.r_info = ELF32_R_INFO (dynindx, R_ARM_JUMP_SLOT); initial_got_entry = (splt->output_section->vma + splt->output_offset); + + /* PR ld/16017 + When thumb only we need to set the LSB for any address that + will be used with an interworking branch instruction. */ + if (using_thumb_only (htab)) + initial_got_entry |= 1; } } @@ -20230,10 +20244,10 @@ elf32_arm_get_synthetic_symtab (bfd *abfd, } static bfd_boolean -elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr * hdr) +elf32_arm_section_flags (const Elf_Internal_Shdr *hdr) { if (hdr->sh_flags & SHF_ARM_PURECODE) - *flags |= SEC_ELF_PURECODE; + hdr->bfd_section->flags |= SEC_ELF_PURECODE; return TRUE; }