X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-arm.c;h=bd0fee615c030e147a3904de85aa06fede099c80;hb=8029e59279e861071234decddf6a493119e0cb98;hp=3bfe31278d9a32a0de36230ea2f80a85e0c10bcf;hpb=4ec192e6abe86319b9e9af6f2ae4cf0614b1e2b3;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 3bfe31278d..bd0fee615c 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -3567,9 +3567,7 @@ using_thumb_only (struct elf32_arm_link_hash_table *globals) arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch); /* Force return logic to be reviewed for each new architecture. */ - BFD_ASSERT (arch <= TAG_CPU_ARCH_V8 - || arch == TAG_CPU_ARCH_V8M_BASE - || arch == TAG_CPU_ARCH_V8M_MAIN); + BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN); if (arch == TAG_CPU_ARCH_V6_M || arch == TAG_CPU_ARCH_V6S_M @@ -3596,14 +3594,13 @@ using_thumb2 (struct elf32_arm_link_hash_table *globals) arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch); /* Force return logic to be reviewed for each new architecture. */ - BFD_ASSERT (arch <= TAG_CPU_ARCH_V8 - || arch == TAG_CPU_ARCH_V8M_BASE - || arch == TAG_CPU_ARCH_V8M_MAIN); + BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN); return (arch == TAG_CPU_ARCH_V6T2 || arch == TAG_CPU_ARCH_V7 || arch == TAG_CPU_ARCH_V7E_M || arch == TAG_CPU_ARCH_V8 + || arch == TAG_CPU_ARCH_V8R || arch == TAG_CPU_ARCH_V8M_MAIN); } @@ -3616,9 +3613,7 @@ using_thumb2_bl (struct elf32_arm_link_hash_table *globals) bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch); /* Force return logic to be reviewed for each new architecture. */ - BFD_ASSERT (arch <= TAG_CPU_ARCH_V8 - || arch == TAG_CPU_ARCH_V8M_BASE - || arch == TAG_CPU_ARCH_V8M_MAIN); + BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN); /* Architecture was introduced after ARMv6T2 (eg. ARMv6-M). */ return (arch == TAG_CPU_ARCH_V6T2 @@ -3824,14 +3819,13 @@ arch_has_arm_nop (struct elf32_arm_link_hash_table *globals) Tag_CPU_arch); /* Force return logic to be reviewed for each new architecture. */ - BFD_ASSERT (arch <= TAG_CPU_ARCH_V8 - || arch == TAG_CPU_ARCH_V8M_BASE - || arch == TAG_CPU_ARCH_V8M_MAIN); + BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN); return (arch == TAG_CPU_ARCH_V6T2 || arch == TAG_CPU_ARCH_V6K || arch == TAG_CPU_ARCH_V7 - || arch == TAG_CPU_ARCH_V8); + || arch == TAG_CPU_ARCH_V8 + || arch == TAG_CPU_ARCH_V8R); } static bfd_boolean @@ -4146,7 +4140,7 @@ arm_type_of_stub (struct bfd_link_info *info, _bfd_error_handler (_("%B(%s): warning: interworking not enabled.\n" " first occurrence: %B: ARM call to Thumb"), - sym_sec->owner, input_bfd, name); + sym_sec->owner, name, input_bfd); } /* We have an extra 2-bytes reach because of @@ -8621,12 +8615,12 @@ bfd_elf32_arm_stm32l4xx_erratum_scan (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): error: multiple load detected" + (_("%B(%A+%#x): error: multiple load detected" " in non-last IT block instruction :" " STM32L4XX veneer cannot be generated.\n" "Use gcc option -mrestrict-it to generate" " only one instruction per IT block.\n"), - abfd, sec, (long) i); + abfd, sec, i); } else { @@ -9726,8 +9720,8 @@ elf32_arm_tls_relax (struct elf32_arm_link_hash_table *globals, | bfd_get_16 (input_bfd, contents + rel->r_offset + 2); _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unexpected Thumb instruction '0x%x' in TLS trampoline"), - input_bfd, input_sec, (unsigned long)rel->r_offset, insn); + (_("%B(%A+%#Lx): unexpected Thumb instruction '%#lx' in TLS trampoline"), + input_bfd, input_sec, rel->r_offset, insn); return bfd_reloc_notsupported; } break; @@ -9766,8 +9760,8 @@ elf32_arm_tls_relax (struct elf32_arm_link_hash_table *globals, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unexpected ARM instruction '0x%x' in TLS trampoline"), - input_bfd, input_sec, (unsigned long)rel->r_offset, insn); + (_("%B(%A+%#Lx): unexpected ARM instruction '%#lx' in TLS trampoline"), + input_bfd, input_sec, rel->r_offset, insn); return bfd_reloc_notsupported; } break; @@ -9906,12 +9900,14 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, bfd_vma plt_offset; bfd_vma gotplt_offset; bfd_boolean has_iplt_entry; + bfd_boolean resolved_to_zero; globals = elf32_arm_hash_table (info); if (globals == NULL) return bfd_reloc_notsupported; BFD_ASSERT (is_arm_elf (input_bfd)); + BFD_ASSERT (howto != NULL); /* Some relocation types map to different relocations depending on the target. We pick the right one here. */ @@ -10022,6 +10018,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, gotplt_offset = (bfd_vma) -1; } + resolved_to_zero = (h != NULL + && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); + switch (r_type) { case R_ARM_NONE: @@ -10086,7 +10085,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, && !(input_bfd == globals->stub_bfd && strstr (input_section->name, STUB_SUFFIX)) && (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && !resolved_to_zero) || h->root.type != bfd_link_hash_undefweak) && r_type != R_ARM_PC24 && r_type != R_ARM_CALL @@ -10508,7 +10508,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, /* PR 21523: Use an absolute value. The user of this reloc will have already selected an ADD or SUB insn appropriately. */ - value = abs (relocation); + value = labs (relocation); if (value >= 0x1000) return bfd_reloc_overflow; @@ -11289,7 +11289,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, if ((bfd_link_pic (info) || indx != 0) && (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && !resolved_to_zero) || h->root.type != bfd_link_hash_undefweak)) { need_relocs = TRUE; @@ -11530,9 +11531,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unexpected Thumb instruction '0x%x' referenced by TLS_GOTDESC"), - input_bfd, input_section, - (unsigned long)rel->r_offset, insn); + (_("%B(%A+%#Lx): unexpected Thumb instruction '%#lx' referenced by TLS_GOTDESC"), + input_bfd, input_section, rel->r_offset, insn); return bfd_reloc_notsupported; } } @@ -11554,9 +11554,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, default: _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unexpected ARM instruction '0x%x' referenced by TLS_GOTDESC"), - input_bfd, input_section, - (unsigned long)rel->r_offset, insn); + (_("%B(%A+%#Lx): unexpected ARM instruction '%#lx' referenced by TLS_GOTDESC"), + input_bfd, input_section, rel->r_offset, insn); return bfd_reloc_notsupported; } } @@ -11584,9 +11583,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"), - input_bfd, input_section, - (long) rel->r_offset, howto->name); + (_("%B(%A+%#Lx): %s relocation not permitted in shared object"), + input_bfd, input_section, rel->r_offset, howto->name); return bfd_reloc_notsupported; } else @@ -11798,9 +11796,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"), - input_bfd, input_section, - (long) rel->r_offset, howto->name); + (_("%B(%A+%#Lx): Only ADD or SUB instructions are allowed for ALU group relocations"), + input_bfd, input_section, rel->r_offset); return bfd_reloc_overflow; } @@ -11839,10 +11836,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"), - input_bfd, input_section, - (long) rel->r_offset, signed_value < 0 ? - signed_value : signed_value, - howto->name); + (_("%B(%A+%#Lx): Overflow whilst splitting %#Lx for group relocation %s"), + input_bfd, input_section, rel->r_offset, + signed_value < 0 ? -signed_value : signed_value, howto->name); return bfd_reloc_overflow; } @@ -11930,9 +11926,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"), - input_bfd, input_section, - (long) rel->r_offset, labs (signed_value), howto->name); + (_("%B(%A+%#Lx): Overflow whilst splitting %#Lx for group relocation %s"), + input_bfd, input_section, rel->r_offset, + signed_value < 0 ? -signed_value : signed_value, howto->name); return bfd_reloc_overflow; } @@ -12016,9 +12012,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"), - input_bfd, input_section, - (long) rel->r_offset, labs (signed_value), howto->name); + (_("%B(%A+%#Lx): Overflow whilst splitting %#Lx for group relocation %s"), + input_bfd, input_section, rel->r_offset, + signed_value < 0 ? -signed_value : signed_value, howto->name); return bfd_reloc_overflow; } @@ -12104,9 +12100,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"), - input_bfd, input_section, - (long) rel->r_offset, labs (signed_value), howto->name); + (_("%B(%A+%#Lx): Overflow whilst splitting %#Lx for group relocation %s"), + input_bfd, input_section, rel->r_offset, + signed_value < 0 ? -signed_value : signed_value, howto->name); return bfd_reloc_overflow; } @@ -12300,8 +12296,10 @@ elf32_arm_relocate_section (bfd * output_bfd, || r_type == R_ARM_GNU_VTINHERIT) continue; - bfd_reloc.howto = elf32_arm_howto_from_type (r_type); - howto = bfd_reloc.howto; + howto = bfd_reloc.howto = elf32_arm_howto_from_type (r_type); + + if (howto == NULL) + return _bfd_unrecognized_reloc (input_bfd, input_section, r_type); h = NULL; sym = NULL; @@ -12368,9 +12366,9 @@ elf32_arm_relocate_section (bfd * output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"), + (_("%B(%A+%#Lx): %s relocation against SEC_MERGE section"), input_bfd, input_section, - (long) rel->r_offset, howto->name); + rel->r_offset, howto->name); return FALSE; } @@ -12480,12 +12478,12 @@ elf32_arm_relocate_section (bfd * output_bfd, _bfd_error_handler ((sym_type == STT_TLS /* xgettext:c-format */ - ? _("%B(%A+0x%lx): %s used with TLS symbol %s") + ? _("%B(%A+%#Lx): %s used with TLS symbol %s") /* xgettext:c-format */ - : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")), + : _("%B(%A+%#Lx): %s used with non-TLS symbol %s")), input_bfd, input_section, - (long) rel->r_offset, + rel->r_offset, howto->name, name); } @@ -12535,10 +12533,10 @@ elf32_arm_relocate_section (bfd * output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), + (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, - (long) rel->r_offset, + rel->r_offset, howto->name, h->root.root.string); return FALSE; @@ -13329,6 +13327,25 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out, T(V8), /* V7E_M. */ T(V8) /* V8. */ }; + const int v8r[] = + { + T(V8R), /* PRE_V4. */ + T(V8R), /* V4. */ + T(V8R), /* V4T. */ + T(V8R), /* V5T. */ + T(V8R), /* V5TE. */ + T(V8R), /* V5TEJ. */ + T(V8R), /* V6. */ + T(V8R), /* V6KZ. */ + T(V8R), /* V6T2. */ + T(V8R), /* V6K. */ + T(V8R), /* V7. */ + T(V8R), /* V6_M. */ + T(V8R), /* V6S_M. */ + T(V8R), /* V7E_M. */ + T(V8), /* V8. */ + T(V8R), /* V8R. */ + }; const int v8m_baseline[] = { -1, /* PRE_V4. */ @@ -13346,7 +13363,7 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out, T(V8M_BASE), /* V6S_M. */ -1, /* V7E_M. */ -1, /* V8. */ - -1, + -1, /* V8R. */ T(V8M_BASE) /* V8-M BASELINE. */ }; const int v8m_mainline[] = @@ -13366,7 +13383,7 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out, T(V8M_MAIN), /* V6S_M. */ T(V8M_MAIN), /* V7E_M. */ -1, /* V8. */ - -1, + -1, /* V8R. */ T(V8M_MAIN), /* V8-M BASELINE. */ T(V8M_MAIN) /* V8-M MAINLINE. */ }; @@ -13387,7 +13404,7 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out, T(V6S_M), /* V6S_M. */ T(V7E_M), /* V7E_M. */ T(V8), /* V8. */ - -1, /* Unused. */ + -1, /* V8R. */ T(V8M_BASE), /* V8-M BASELINE. */ T(V8M_MAIN), /* V8-M MAINLINE. */ T(V4T_PLUS_V6_M) /* V4T plus V6_M. */ @@ -13401,7 +13418,7 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out, v6s_m, v7e_m, v8, - NULL, + v8r, v8m_baseline, v8m_mainline, /* Pseudo-architecture. */ @@ -14029,7 +14046,7 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, struct bfd_link_info *info) if (in_attr[Tag_MPextension_use].i != in_attr[i].i) { _bfd_error_handler - (_("%B has has both the current and legacy " + (_("%B has both the current and legacy " "Tag_MPextension_use attributes"), ibfd); result = FALSE; @@ -14280,199 +14297,6 @@ elf32_arm_gc_mark_hook (asection *sec, return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); } -/* Update the got entry reference counts for the section being removed. */ - -static bfd_boolean -elf32_arm_gc_sweep_hook (bfd * abfd, - struct bfd_link_info * info, - asection * sec, - const Elf_Internal_Rela * relocs) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_signed_vma *local_got_refcounts; - const Elf_Internal_Rela *rel, *relend; - struct elf32_arm_link_hash_table * globals; - - if (bfd_link_relocatable (info)) - return TRUE; - - globals = elf32_arm_hash_table (info); - if (globals == NULL) - return FALSE; - - elf_section_data (sec)->local_dynrel = NULL; - - symtab_hdr = & elf_symtab_hdr (abfd); - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - - check_use_blx (globals); - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h = NULL; - struct elf32_arm_link_hash_entry *eh; - int r_type; - bfd_boolean call_reloc_p; - bfd_boolean may_become_dynamic_p; - bfd_boolean may_need_local_target_p; - union gotplt_union *root_plt; - struct arm_plt_info *arm_plt; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } - eh = (struct elf32_arm_link_hash_entry *) h; - - call_reloc_p = FALSE; - may_become_dynamic_p = FALSE; - may_need_local_target_p = FALSE; - - r_type = ELF32_R_TYPE (rel->r_info); - r_type = arm_real_reloc_type (globals, r_type); - switch (r_type) - { - case R_ARM_GOT32: - case R_ARM_GOT_PREL: - case R_ARM_TLS_GD32: - case R_ARM_TLS_IE32: - if (h != NULL) - { - if (h->got.refcount > 0) - h->got.refcount -= 1; - } - else if (local_got_refcounts != NULL) - { - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx] -= 1; - } - break; - - case R_ARM_TLS_LDM32: - globals->tls_ldm_got.refcount -= 1; - break; - - case R_ARM_PC24: - case R_ARM_PLT32: - case R_ARM_CALL: - case R_ARM_JUMP24: - case R_ARM_PREL31: - case R_ARM_THM_CALL: - case R_ARM_THM_JUMP24: - case R_ARM_THM_JUMP19: - call_reloc_p = TRUE; - may_need_local_target_p = TRUE; - break; - - case R_ARM_ABS12: - if (!globals->vxworks_p) - { - may_need_local_target_p = TRUE; - break; - } - /* Fall through. */ - case R_ARM_ABS32: - case R_ARM_ABS32_NOI: - case R_ARM_REL32: - case R_ARM_REL32_NOI: - case R_ARM_MOVW_ABS_NC: - case R_ARM_MOVT_ABS: - case R_ARM_MOVW_PREL_NC: - case R_ARM_MOVT_PREL: - case R_ARM_THM_MOVW_ABS_NC: - case R_ARM_THM_MOVT_ABS: - case R_ARM_THM_MOVW_PREL_NC: - case R_ARM_THM_MOVT_PREL: - /* Should the interworking branches be here also? */ - if ((bfd_link_pic (info) || globals->root.is_relocatable_executable) - && (sec->flags & SEC_ALLOC) != 0) - { - if (h == NULL - && elf32_arm_howto_from_type (r_type)->pc_relative) - { - call_reloc_p = TRUE; - may_need_local_target_p = TRUE; - } - else - may_become_dynamic_p = TRUE; - } - else - may_need_local_target_p = TRUE; - break; - - default: - break; - } - - if (may_need_local_target_p - && elf32_arm_get_plt_info (abfd, globals, eh, r_symndx, &root_plt, - &arm_plt)) - { - /* If PLT refcount book-keeping is wrong and too low, we'll - see a zero value (going to -1) for the root PLT reference - count. */ - if (root_plt->refcount >= 0) - { - BFD_ASSERT (root_plt->refcount != 0); - root_plt->refcount -= 1; - } - else - /* A value of -1 means the symbol has become local, forced - or seeing a hidden definition. Any other negative value - is an error. */ - BFD_ASSERT (root_plt->refcount == -1); - - if (!call_reloc_p) - arm_plt->noncall_refcount--; - - if (r_type == R_ARM_THM_CALL) - arm_plt->maybe_thumb_refcount--; - - if (r_type == R_ARM_THM_JUMP24 - || r_type == R_ARM_THM_JUMP19) - arm_plt->thumb_refcount--; - } - - if (may_become_dynamic_p) - { - struct elf_dyn_relocs **pp; - struct elf_dyn_relocs *p; - - if (h != NULL) - pp = &(eh->dyn_relocs); - else - { - Elf_Internal_Sym *isym; - - isym = bfd_sym_from_r_symndx (&globals->sym_cache, - abfd, r_symndx); - if (isym == NULL) - return FALSE; - pp = elf32_arm_get_local_dynreloc_list (abfd, r_symndx, isym); - if (pp == NULL) - return FALSE; - } - for (; (p = *pp) != NULL; pp = &p->next) - if (p->sec == sec) - { - /* Everything must go for SEC. */ - *pp = p->next; - break; - } - } - } - - return TRUE; -} - /* Look through the relocs for a section during the first phase. */ static bfd_boolean @@ -14528,7 +14352,7 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info, Elf_Internal_Sym *isym; struct elf_link_hash_entry *h; struct elf32_arm_link_hash_entry *eh; - unsigned long r_symndx; + unsigned int r_symndx; int r_type; r_symndx = ELF32_R_SYM (rel->r_info); @@ -14564,10 +14388,6 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; - - /* PR15323, ref flags aren't set for references in the - same object. */ - h->root.non_ir_ref_regular = 1; } } @@ -15296,7 +15116,7 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info, BFD_ASSERT (dynobj != NULL && (h->needs_plt || h->type == STT_GNU_IFUNC - || h->u.weakdef != NULL + || h->is_weakalias || (h->def_dynamic && h->ref_regular && !h->def_regular))); @@ -15346,12 +15166,12 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info, /* If this is a weak symbol, and there is a real definition, the processor independent code will have arranged for us to see the real definition first, and we can just use the same value. */ - if (h->u.weakdef != NULL) + if (h->is_weakalias) { - BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined - || h->u.weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->u.weakdef->root.u.def.section; - h->root.u.def.value = h->u.weakdef->root.u.def.value; + struct elf_link_hash_entry *def = weakdef (h); + BFD_ASSERT (def->root.type == bfd_link_hash_defined); + h->root.u.def.section = def->root.u.def.section; + h->root.u.def.value = def->root.u.def.value; return TRUE; } @@ -15432,8 +15252,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf) { /* Make sure this symbol is output as a dynamic symbol. Undefined weak syms won't yet be marked as dynamic. */ - if (h->dynindx == -1 - && !h->forced_local) + if (h->dynindx == -1 && !h->forced_local + && h->root.type == bfd_link_hash_undefweak) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; @@ -15520,8 +15340,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf) /* Make sure this symbol is output as a dynamic symbol. Undefined weak syms won't yet be marked as dynamic. */ - if (h->dynindx == -1 - && !h->forced_local) + if (h->dynindx == -1 && !h->forced_local + && h->root.type == bfd_link_hash_undefweak) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; @@ -15705,7 +15525,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf) if (eh->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak) { - if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) + if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) eh->dyn_relocs = NULL; /* Make sure undefined weak symbols are output as a dynamic @@ -15744,8 +15565,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf) { /* Make sure this symbol is output as a dynamic symbol. Undefined weak syms won't yet be marked as dynamic. */ - if (h->dynindx == -1 - && !h->forced_local) + if (h->dynindx == -1 && !h->forced_local + && h->root.type == bfd_link_hash_undefweak) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; @@ -18580,11 +18401,11 @@ elf32_arm_write_section (bfd *output_bfd, branch_to_veneer - (1 << 24) : 0; _bfd_error_handler - (_("%B(%#x): error: Cannot create STM32L4XX veneer. " - "Jump out of range by %ld bytes. " + (_("%B(%#Lx): error: Cannot create STM32L4XX veneer. " + "Jump out of range by %Ld bytes. " "Cannot encode branch instruction. "), output_bfd, - (long) (stm32l4xx_errnode->vma - 4), + stm32l4xx_errnode->vma - 4, out_of_range); continue; } @@ -19382,7 +19203,6 @@ elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym) #define elf_backend_get_symbol_type elf32_arm_get_symbol_type #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook #define elf_backend_gc_mark_extra_sections elf32_arm_gc_mark_extra_sections -#define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook #define elf_backend_check_relocs elf32_arm_check_relocs #define elf_backend_update_relocs elf32_arm_update_relocs #define elf_backend_relocate_section elf32_arm_relocate_section @@ -19441,6 +19261,8 @@ elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym) #undef elf_backend_lookup_section_flags_hook #define elf_backend_lookup_section_flags_hook elf32_arm_lookup_section_flags +#define elf_backend_linux_prpsinfo32_ugid16 TRUE + #include "elf32-target.h" /* Native Client targets. */