BFD: Use `bfd_is_abs_symbol' to determine whether a symbol is absolute
authorMaciej W. Rozycki <macro@mips.com>
Tue, 17 Jul 2018 19:04:53 +0000 (20:04 +0100)
committerMaciej W. Rozycki <macro@mips.com>
Tue, 17 Jul 2018 19:04:53 +0000 (20:04 +0100)
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
bfd/elf32-nds32.c
bfd/elfnn-aarch64.c
bfd/xcofflink.c

index 008d416d2714197f454f445c02a76cbaba79a44e..8dce93072cf88c6366a5a15d9db1c4a324dd5d1e 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 1b30d127a5ae19684409ffd7c413d655060304fc..ae43cdfd8af898e60612fe9256a100192295ff26 100644 (file)
@@ -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
     {
index cf321f32c209755c1e9e86386c2fbba066f41f90..868144489ba23ccfc4cfc92c1005c59fe4d8d5cb 100644 (file)
@@ -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;
index ac9539082b177792fbbb4cb840165e2c2f19f307..b7a50de4171736246e51de3449af241ec11dd798 100644 (file)
@@ -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