X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Felf32-ppc.c;h=839d5ff142a7fff40be1fc03b6912fb2cb2bc919;hb=24872cb30211b650a9360edd2476a6a1dd033cbb;hp=9765a33541f1f18a7713930fad9f17755cf0d267;hpb=fd3619828e94a24a92cddec42cbc0ab33352eeb4;p=binutils-gdb.git diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 9765a33541f..839d5ff142a 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1,5 +1,5 @@ /* PowerPC-specific support for 32-bit ELF - Copyright (C) 1994-2019 Free Software Foundation, Inc. + Copyright (C) 1994-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -37,6 +37,9 @@ #include "dwarf2.h" #include "opcode/ppc.h" +/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */ +#define OCTETS_PER_BYTE(ABFD, SEC) 1 + typedef enum split16_format_type { split16a_type = 0, @@ -956,7 +959,7 @@ ppc_elf_addr16_ha_reloc (bfd *abfd, + input_section->output_section->vma); value >>= 16; - octets = reloc_entry->address * bfd_octets_per_byte (abfd); + octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section); insn = bfd_get_32 (abfd, (bfd_byte *) data + octets); insn &= ~0x1fffc1; insn |= (value & 0xffc1) | ((value & 0x3e) << 15); @@ -1799,7 +1802,7 @@ ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms, bfd_vma stub_off; asymbol *s; arelent *p; - long count, i, stub_delta; + size_t count, i, stub_delta; size_t size; char *names; bfd_byte buf[4]; @@ -2222,8 +2225,9 @@ struct ppc_elf_link_hash_table /* Nonzero if this section has TLS related relocations. */ #define has_tls_reloc sec_flg0 -/* Nonzero if this section has a call to __tls_get_addr. */ -#define has_tls_get_addr_call sec_flg1 +/* Nonzero if this section has a call to __tls_get_addr lacking marker + relocs. */ +#define nomark_tls_get_addr sec_flg1 /* Flag set when PLTCALL relocs are detected. */ #define has_pltcall sec_flg2 @@ -3010,7 +3014,7 @@ ppc_elf_check_relocs (bfd *abfd, ; else /* Mark this section as having an old-style call. */ - sec->has_tls_get_addr_call = 1; + sec->nomark_tls_get_addr = 1; } switch (r_type) @@ -4455,11 +4459,7 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, h = (struct elf_link_hash_entry *) h->root.u.i.link; } - is_local = FALSE; - if (h == NULL - || !h->def_dynamic) - is_local = TRUE; - + is_local = SYMBOL_REFERENCES_LOCAL (info, h); r_type = ELF32_R_TYPE (rel->r_info); /* If this section has old-style __tls_get_addr calls without marker relocs, then check that each @@ -4468,7 +4468,7 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, setup insn. If we don't find matching arg setup relocs, don't do any tls optimization. */ if (pass == 0 - && sec->has_tls_get_addr_call + && sec->nomark_tls_get_addr && h != NULL && h == htab->tls_get_addr && !expecting_tls_get_addr @@ -4533,8 +4533,11 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, else continue; - case R_PPC_TLSGD: case R_PPC_TLSLD: + if (!is_local) + continue; + /* Fall through. */ + case R_PPC_TLSGD: if (rel + 1 < relend && is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info))) { @@ -4581,7 +4584,7 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, if (pass == 0) { if (!expecting_tls_get_addr - || !sec->has_tls_get_addr_call) + || !sec->nomark_tls_get_addr) continue; if (rel + 1 < relend @@ -4631,12 +4634,12 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, indirect call to __tls_get_addr without a marker. Disable optimization in this case. */ if ((tls_clear & (TLS_GD | TLS_LD)) != 0 - && !sec->has_tls_get_addr_call + && !sec->nomark_tls_get_addr && ((*tls_mask & (TLS_TLS | TLS_MARK)) != (TLS_TLS | TLS_MARK))) continue; - if (expecting_tls_get_addr) + if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr) { struct plt_entry *ent; bfd_vma addend = 0; @@ -4649,10 +4652,9 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, got2, addend); if (ent != NULL && ent->plt.refcount > 0) ent->plt.refcount -= 1; - - if (expecting_tls_get_addr == 2) - continue; } + if (tls_clear == 0) + continue; if (tls_set == 0) { @@ -5049,24 +5051,6 @@ got_entries_needed (int tls_mask) return need; } -/* Calculate size of relocs needed for symbol given its TLS_MASK and - NEEDed GOT entries. KNOWN says a TPREL offset can be calculated at - link time. */ - -static inline unsigned int -got_relocs_needed (int tls_mask, unsigned int need, bfd_boolean known) -{ - /* All the entries we allocated need relocs. - Except IE in executable with a local symbol. We could also omit - the DTPREL reloc on the second word of a GD entry under the same - condition as that for IE, but ld.so needs to differentiate - LD and GD entries. */ - if (known && (tls_mask & TLS_TLS) != 0 - && (tls_mask & (TLS_TPREL | TLS_GDIE)) != 0) - need -= 4; - return need * sizeof (Elf32_External_Rela) / 4; -} - /* If H is undefined, make it dynamic if that makes sense. */ static bfd_boolean @@ -5119,7 +5103,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) need = 0; if ((eh->tls_mask & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD)) { - if (!eh->elf.def_dynamic) + if (SYMBOL_REFERENCES_LOCAL (info, &eh->elf)) /* We'll just use htab->tlsld_got.offset. This should always be the case. It's a little odd if we have a local dynamic reloc against a non-local symbol. */ @@ -5133,20 +5117,19 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) else { eh->elf.got.offset = allocate_got (htab, need); - if ((bfd_link_pic (info) + if (((bfd_link_pic (info) + && !((eh->tls_mask & TLS_TLS) != 0 + && bfd_link_executable (info) + && SYMBOL_REFERENCES_LOCAL (info, &eh->elf))) || (htab->elf.dynamic_sections_created && eh->elf.dynindx != -1 && !SYMBOL_REFERENCES_LOCAL (info, &eh->elf))) && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &eh->elf)) { asection *rsec; - bfd_boolean tprel_known = (bfd_link_executable (info) - && SYMBOL_REFERENCES_LOCAL (info, - &eh->elf)); - need = got_relocs_needed (eh->tls_mask, need, tprel_known); - if ((eh->tls_mask & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD) - && eh->elf.def_dynamic) + need *= sizeof (Elf32_External_Rela) / 4; + if ((eh->tls_mask & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD)) need -= sizeof (Elf32_External_Rela); rsec = htab->elf.srelgot; if (eh->elf.type == STT_GNU_IFUNC) @@ -5594,12 +5577,13 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd, else { *local_got = allocate_got (htab, need); - if (bfd_link_pic (info)) + if (bfd_link_pic (info) + && !((*lgot_masks & TLS_TLS) != 0 + && bfd_link_executable (info))) { asection *srel; - bfd_boolean tprel_known = bfd_link_executable (info); - need = got_relocs_needed (*lgot_masks, need, tprel_known); + need *= sizeof (Elf32_External_Rela) / 4; srel = htab->elf.srelgot; if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC) srel = htab->elf.irelplt; @@ -5676,7 +5660,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd, if (htab->tlsld_got.refcount > 0) { htab->tlsld_got.offset = allocate_got (htab, 8); - if (bfd_link_pic (info)) + if (bfd_link_dll (info)) htab->elf.srelgot->size += sizeof (Elf32_External_Rela); } else @@ -6859,7 +6843,7 @@ _bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg) { unsigned int rtra; - if ((insn & (0x3f << 26)) != 31 << 26) + if ((insn & (0x3fu << 26)) != 31 << 26) return 0; if (reg == 0 || ((insn >> 11) & 0x1f) == reg) @@ -6877,13 +6861,13 @@ _bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg) || ((insn & (0x1f << 6)) >= 16 << 6 && (insn & (0x1f << 6)) < 24 << 6))) /* load and store indexed -> dform. */ - insn = (32 | ((insn >> 6) & 0x1f)) << 26; + insn = (32u | ((insn >> 6) & 0x1f)) << 26; else if ((insn & (((0x1a << 5) | 0x1f) << 1)) == 21 << 1) /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu. */ - insn = ((58 | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1); + insn = ((58u | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1); else if ((insn & (((0x1f << 5) | 0x1f) << 1)) == 341 << 1) /* lwax -> lwa. */ - insn = (58 << 26) | 2; + insn = (58u << 26) | 2; else return 0; insn |= rtra; @@ -6898,36 +6882,36 @@ unsigned int _bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg) { if ((insn & (0x1f << 16)) == reg << 16 - && ((insn & (0x3f << 26)) == 14u << 26 /* addi */ - || (insn & (0x3f << 26)) == 15u << 26 /* addis */ - || (insn & (0x3f << 26)) == 32u << 26 /* lwz */ - || (insn & (0x3f << 26)) == 34u << 26 /* lbz */ - || (insn & (0x3f << 26)) == 36u << 26 /* stw */ - || (insn & (0x3f << 26)) == 38u << 26 /* stb */ - || (insn & (0x3f << 26)) == 40u << 26 /* lhz */ - || (insn & (0x3f << 26)) == 42u << 26 /* lha */ - || (insn & (0x3f << 26)) == 44u << 26 /* sth */ - || (insn & (0x3f << 26)) == 46u << 26 /* lmw */ - || (insn & (0x3f << 26)) == 47u << 26 /* stmw */ - || (insn & (0x3f << 26)) == 48u << 26 /* lfs */ - || (insn & (0x3f << 26)) == 50u << 26 /* lfd */ - || (insn & (0x3f << 26)) == 52u << 26 /* stfs */ - || (insn & (0x3f << 26)) == 54u << 26 /* stfd */ - || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */ + && ((insn & (0x3fu << 26)) == 14u << 26 /* addi */ + || (insn & (0x3fu << 26)) == 15u << 26 /* addis */ + || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */ + || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */ + || (insn & (0x3fu << 26)) == 36u << 26 /* stw */ + || (insn & (0x3fu << 26)) == 38u << 26 /* stb */ + || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */ + || (insn & (0x3fu << 26)) == 42u << 26 /* lha */ + || (insn & (0x3fu << 26)) == 44u << 26 /* sth */ + || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */ + || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */ + || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */ + || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */ + || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */ + || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */ + || ((insn & (0x3fu << 26)) == 58u << 26 /* lwa,ld,lmd */ && (insn & 3) != 1) - || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */ + || ((insn & (0x3fu << 26)) == 62u << 26 /* std, stmd */ && ((insn & 3) == 0 || (insn & 3) == 3)))) { insn &= ~(0x1f << 16); } else if ((insn & (0x1f << 21)) == reg << 21 - && ((insn & (0x3e << 26)) == 24u << 26 /* ori, oris */ - || (insn & (0x3e << 26)) == 26u << 26 /* xori,xoris */ - || (insn & (0x3e << 26)) == 28u << 26 /* andi,andis */)) + && ((insn & (0x3eu << 26)) == 24u << 26 /* ori, oris */ + || (insn & (0x3eu << 26)) == 26u << 26 /* xori,xoris */ + || (insn & (0x3eu << 26)) == 28u << 26 /* andi,andis */)) { insn &= ~(0x1f << 21); insn |= (insn & (0x1f << 16)) << 5; - if ((insn & (0x3e << 26)) == 26 << 26 /* xori,xoris */) + if ((insn & (0x3eu << 26)) == 26u << 26 /* xori,xoris */) insn -= 2 >> 26; /* convert to ori,oris */ } else @@ -6938,17 +6922,17 @@ _bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg) static bfd_boolean is_insn_ds_form (unsigned int insn) { - return ((insn & (0x3f << 26)) == 58u << 26 /* ld,ldu,lwa */ - || (insn & (0x3f << 26)) == 62u << 26 /* std,stdu,stq */ - || (insn & (0x3f << 26)) == 57u << 26 /* lfdp */ - || (insn & (0x3f << 26)) == 61u << 26 /* stfdp */); + return ((insn & (0x3fu << 26)) == 58u << 26 /* ld,ldu,lwa */ + || (insn & (0x3fu << 26)) == 62u << 26 /* std,stdu,stq */ + || (insn & (0x3fu << 26)) == 57u << 26 /* lfdp */ + || (insn & (0x3fu << 26)) == 61u << 26 /* stfdp */); } static bfd_boolean is_insn_dq_form (unsigned int insn) { - return ((insn & (0x3f << 26)) == 56u << 26 /* lq */ - || ((insn & (0x3f << 26)) == (61u << 26) /* lxv, stxv */ + return ((insn & (0x3fu << 26)) == 56u << 26 /* lq */ + || ((insn & (0x3fu << 26)) == (61u << 26) /* lxv, stxv */ && (insn & 3) == 1)); } @@ -7246,7 +7230,7 @@ ppc_elf_relocate_section (bfd *output_bfd, stays with its arg setup insns, ie. that the next reloc is the __tls_get_addr call associated with the current reloc. Edit both insns. */ - if (input_section->has_tls_get_addr_call + if (input_section->nomark_tls_get_addr && rel + 1 < relend && branch_reloc_hash_match (input_bfd, rel + 1, htab->tls_get_addr)) @@ -7261,7 +7245,7 @@ ppc_elf_relocate_section (bfd *output_bfd, { /* IE */ insn1 &= (0x1f << 21) | (0x1f << 16); - insn1 |= 32 << 26; /* lwz */ + insn1 |= 32u << 26; /* lwz */ if (offset != (bfd_vma) -1) { rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE); @@ -7430,7 +7414,7 @@ ppc_elf_relocate_section (bfd *output_bfd, insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset); - if ((insn & (0x3f << 26)) == 15u << 26 + if ((insn & (0x3fu << 26)) == 15u << 26 && (insn & (0x1f << 16)) != 0) { if (!bfd_link_pic (info)) @@ -7466,7 +7450,7 @@ ppc_elf_relocate_section (bfd *output_bfd, { insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset); - if ((insn & (0x3f << 26)) == (15u << 26) + if ((insn & (0x3fu << 26)) == (15u << 26) && (insn & (0x1f << 16)) == 0 /* lis */) { bfd_byte *p; @@ -7529,23 +7513,23 @@ ppc_elf_relocate_section (bfd *output_bfd, { insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset); - if ((insn & (0x3f << 26)) == 14u << 26 /* addi */ - || (insn & (0x3f << 26)) == 32u << 26 /* lwz */ - || (insn & (0x3f << 26)) == 34u << 26 /* lbz */ - || (insn & (0x3f << 26)) == 36u << 26 /* stw */ - || (insn & (0x3f << 26)) == 38u << 26 /* stb */ - || (insn & (0x3f << 26)) == 40u << 26 /* lhz */ - || (insn & (0x3f << 26)) == 42u << 26 /* lha */ - || (insn & (0x3f << 26)) == 44u << 26 /* sth */ - || (insn & (0x3f << 26)) == 46u << 26 /* lmw */ - || (insn & (0x3f << 26)) == 47u << 26 /* stmw */ - || (insn & (0x3f << 26)) == 48u << 26 /* lfs */ - || (insn & (0x3f << 26)) == 50u << 26 /* lfd */ - || (insn & (0x3f << 26)) == 52u << 26 /* stfs */ - || (insn & (0x3f << 26)) == 54u << 26 /* stfd */ - || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */ + if ((insn & (0x3fu << 26)) == 14u << 26 /* addi */ + || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */ + || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */ + || (insn & (0x3fu << 26)) == 36u << 26 /* stw */ + || (insn & (0x3fu << 26)) == 38u << 26 /* stb */ + || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */ + || (insn & (0x3fu << 26)) == 42u << 26 /* lha */ + || (insn & (0x3fu << 26)) == 44u << 26 /* sth */ + || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */ + || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */ + || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */ + || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */ + || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */ + || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */ + || ((insn & (0x3fu << 26)) == 58u << 26 /* lwa,ld,lmd */ && (insn & 3) != 1) - || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */ + || ((insn & (0x3fu << 26)) == 62u << 26 /* std, stmd */ && ((insn & 3) == 0 || (insn & 3) == 3))) { /* Arrange to apply the reloc addend, if any. */ @@ -7655,7 +7639,7 @@ ppc_elf_relocate_section (bfd *output_bfd, { bfd_byte *p = contents + (rel->r_offset & ~3); unsigned int insn = bfd_get_32 (input_bfd, p); - if ((insn & ((0x3f << 26) | 0x1f << 16)) + if ((insn & ((0x3fu << 26) | 0x1f << 16)) != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */) /* xgettext:c-format */ info->callbacks->minfo @@ -7749,8 +7733,7 @@ ppc_elf_relocate_section (bfd *output_bfd, indx = 0; if (tls_type == (TLS_TLS | TLS_LD) - && (h == NULL - || !h->def_dynamic)) + && SYMBOL_REFERENCES_LOCAL (info, h)) offp = &htab->tlsld_got.offset; else if (h != NULL) { @@ -7792,8 +7775,8 @@ ppc_elf_relocate_section (bfd *output_bfd, if (offp == &htab->tlsld_got.offset) tls_m = TLS_LD; - else if (h == NULL - || !h->def_dynamic) + else if ((tls_m & TLS_LD) != 0 + && SYMBOL_REFERENCES_LOCAL (info, h)) tls_m &= ~TLS_LD; /* We might have multiple got entries for this sym. @@ -7827,9 +7810,8 @@ ppc_elf_relocate_section (bfd *output_bfd, if (indx != 0 || (bfd_link_pic (info) && (h == NULL - || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h) - || offp == &htab->tlsld_got.offset) - && !(tls_ty == (TLS_TLS | TLS_TPREL) + || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + && !(tls_ty != 0 && bfd_link_executable (info) && SYMBOL_REFERENCES_LOCAL (info, h)))) { @@ -7939,8 +7921,7 @@ ppc_elf_relocate_section (bfd *output_bfd, if (tls_type != (TLS_TLS | TLS_LD)) { if ((tls_mask & TLS_LD) != 0 - && !(h == NULL - || !h->def_dynamic)) + && !SYMBOL_REFERENCES_LOCAL (info, h)) off += 8; if (tls_type != (TLS_TLS | TLS_GD)) { @@ -8799,7 +8780,7 @@ ppc_elf_relocate_section (bfd *output_bfd, case R_PPC_VLE_ADDR20: ppc_elf_vle_split20 (output_bfd, contents + rel->r_offset, relocation); - continue; + goto copy_reloc; /* Relocate against the beginning of the section. */ case R_PPC_SECTOFF: @@ -9012,11 +8993,11 @@ ppc_elf_relocate_section (bfd *output_bfd, unsigned int insn; insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3)); - if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */) + if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */) complain = complain_overflow_bitfield; - else if ((insn & (0x3f << 26)) == 28u << 26 /* andi */ - || (insn & (0x3f << 26)) == 24u << 26 /* ori */ - || (insn & (0x3f << 26)) == 26u << 26 /* xori */) + else if ((insn & (0x3fu << 26)) == 28u << 26 /* andi */ + || (insn & (0x3fu << 26)) == 24u << 26 /* ori */ + || (insn & (0x3fu << 26)) == 26u << 26 /* xori */) complain = complain_overflow_unsigned; } if (howto->complain_on_overflow != complain) @@ -9240,10 +9221,10 @@ ppc_elf_relocate_section (bfd *output_bfd, . new_page: new_page: . */ insn = bfd_get_32 (input_bfd, contents + offset); - if ((insn & (0x3f << 26)) == (18u << 26) /* b,bl,ba,bla */ - || ((insn & (0x3f << 26)) == (16u << 26) /* bc,bcl,bca,bcla*/ + if ((insn & (0x3fu << 26)) == (18u << 26) /* b,bl,ba,bla */ + || ((insn & (0x3fu << 26)) == (16u << 26) /* bc,bcl,bca,bcla*/ && (insn & (0x14 << 21)) == (0x14 << 21)) /* with BO=0x14 */ - || ((insn & (0x3f << 26)) == (19u << 26) + || ((insn & (0x3fu << 26)) == (19u << 26) && (insn & (0x3ff << 1)) == (16u << 1) /* bclr,bclrl */ && (insn & (0x14 << 21)) == (0x14 << 21)))/* with BO=0x14 */ continue; @@ -9327,7 +9308,7 @@ ppc_elf_relocate_section (bfd *output_bfd, else rel = NULL; - if ((insn & (0x3f << 26)) == (16u << 26) /* bc */ + if ((insn & (0x3fu << 26)) == (16u << 26) /* bc */ && (insn & 2) == 0 /* relative */) { bfd_vma delta = ((insn & 0xfffc) ^ 0x8000) - 0x8000; @@ -10531,6 +10512,5 @@ ppc_elf_vxworks_final_write_processing (bfd *abfd) #undef elf32_bed #define elf32_bed ppc_elf_vxworks_bed -#undef elf_backend_post_process_headers #include "elf32-target.h"