From c691de6a16a87adc686ce5cd6c9be54ee0b1a8c1 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Tue, 17 Jul 2018 20:04:53 +0100 Subject: [PATCH] BFD: Use `bfd_is_abs_symbol' to determine whether a symbol is absolute Use `bfd_is_abs_symbol' to determine whether a symbol is absolute, avoiding a problem with ordinary symbols defined in a linker script outside an output section definition. Such symbols have its owning section set to the absolute section up to the final link phase. A flag has been added to the link hash to identify such symbols. Rather than checking the flag by hand, use the macro that does it uniformly for all users. bfd/ * elf32-nds32.c (nds32_elf_relax_loadstore): Use `bfd_is_abs_symbol' rather than `bfd_is_abs_section' in checking whether the symbol is absolute. (nds32_elf_relax_lo12): Likewise. * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Likewise. (elfNN_aarch64_check_relocs): Likewise. * xcofflink.c (xcoff_need_ldrel_p): Likewise. (bfd_xcoff_import_symbol): Likewise. (xcoff_write_global_symbol): Likewise. --- bfd/ChangeLog | 12 ++++++++++++ bfd/elf32-nds32.c | 4 ++-- bfd/elfnn-aarch64.c | 6 ++---- bfd/xcofflink.c | 9 +++------ 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 008d416..8dce930 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,17 @@ 2018-07-17 Maciej W. Rozycki + * elf32-nds32.c (nds32_elf_relax_loadstore): Use + `bfd_is_abs_symbol' rather than `bfd_is_abs_section' in checking + whether the symbol is absolute. + (nds32_elf_relax_lo12): Likewise. + * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Likewise. + (elfNN_aarch64_check_relocs): Likewise. + * xcofflink.c (xcoff_need_ldrel_p): Likewise. + (bfd_xcoff_import_symbol): Likewise. + (xcoff_write_global_symbol): Likewise. + +2018-07-17 Maciej W. Rozycki + * linker.c (bfd_is_abs_symbol): New macro. * bfd-in2.h: Regenerate. diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index 1b30d12..ae43cdf 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -10567,7 +10567,7 @@ nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd, /* This is avoid to relax symbol address which is fixed relocations. Ex: _stack. */ - if (h && bfd_is_abs_section (h->root.u.def.section)) + if (h && bfd_is_abs_symbol (&h->root)) return FALSE; } @@ -10707,7 +10707,7 @@ nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd, /* This is avoid to relax symbol address which is fixed relocations. Ex: _stack. */ else if (N32_OP6 (insn) == N32_OP6_ORI - && h && bfd_is_abs_section (h->root.u.def.section)) + && h && bfd_is_abs_symbol (&h->root)) return; else { diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index cf321f3..8681444 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -5224,8 +5224,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak : bfd_is_und_section (sym_sec)); - abs_symbol_p = (h !=NULL && h->root.type == bfd_link_hash_defined - && bfd_is_abs_section (h->root.u.def.section)); + abs_symbol_p = h != NULL && bfd_is_abs_symbol (&h->root); /* Since STT_GNU_IFUNC symbol must go through PLT, we handle @@ -7363,8 +7362,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, if (h != NULL /* This is an absolute symbol. It represents a value instead of an address. */ - && ((h->root.type == bfd_link_hash_defined - && bfd_is_abs_section (h->root.u.def.section)) + && (bfd_is_abs_symbol (&h->root) /* This is an undefined symbol. */ || h->root.type == bfd_link_hash_undefined)) break; diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index ac95390..b7a50de 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -2687,10 +2687,7 @@ xcoff_need_ldrel_p (struct bfd_link_info *info, struct internal_reloc *rel, case R_RLA: /* Absolute relocations against absolute symbols can be resolved statically. */ - if (h != NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && bfd_is_abs_section (h->root.u.def.section)) + if (h != NULL && bfd_is_abs_symbol (&h->root)) return FALSE; return TRUE; @@ -3125,7 +3122,7 @@ bfd_xcoff_import_symbol (bfd *output_bfd, if (val != (bfd_vma) -1) { if (h->root.type == bfd_link_hash_defined - && (! bfd_is_abs_section (h->root.u.def.section) + && (!bfd_is_abs_symbol (&h->root) || h->root.u.def.value != val)) (*info->callbacks->multiple_definition) (info, &h->root, output_bfd, bfd_abs_section_ptr, val); @@ -5589,7 +5586,7 @@ xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf) || h->root.type == bfd_link_hash_defweak) && h->smclas == XMC_XO) { - BFD_ASSERT (bfd_is_abs_section (h->root.u.def.section)); + BFD_ASSERT (bfd_is_abs_symbol (&h->root)); isym.n_value = h->root.u.def.value; isym.n_scnum = N_UNDEF; if (h->root.type == bfd_link_hash_undefweak -- 2.7.4