[binutils-gdb] BFD: Use `bfd_is_abs_symbol' to determine whether a symbol is absolute

Maciej W.Rozycki macro@sourceware.org
Tue Jul 17 19:06:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c691de6a16a87adc686ce5cd6c9be54ee0b1a8c1

commit c691de6a16a87adc686ce5cd6c9be54ee0b1a8c1
Author: Maciej W. Rozycki <macro@mips.com>
Date:   Tue Jul 17 20:04:53 2018 +0100

    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.

Diff:
---
 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  <macro@mips.com>
 
+	* 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  <macro@mips.com>
+
 	* 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



More information about the Binutils-cvs mailing list