X86-64: Set check_relocs_failed on error
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 29 Apr 2016 11:29:38 +0000 (04:29 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 29 Apr 2016 11:29:38 +0000 (04:29 -0700)
When checking relocations, set check_relocs_failed on error.

* elf64-x86-64.c (elf_x86_64_check_relocs): Set
check_relocs_failed on error.

bfd/ChangeLog
bfd/elf64-x86-64.c

index f60ee034c387d2b77bfc2cf14c7924bdaa7d9cc7..23d7f68264c6bad586bd33ab4c3d5bdfe8a704ac 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf64-x86-64.c (elf_x86_64_check_relocs): Set
+       check_relocs_failed on error.
+
 2016-04-29  Nick Clifton  <nickc@redhat.com>
 
        PR 19938
index 8a5ce75091468ecdb2f08609d1cf68a3a160047c..e87a1e00ac001bffe2c4d3886857f6f6ab704452 100644 (file)
@@ -1663,7 +1663,10 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
   htab = elf_x86_64_hash_table (info);
   if (htab == NULL)
-    return FALSE;
+    {
+      sec->check_relocs_failed = 1;
+      return FALSE;
+    }
 
   use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed;
 
@@ -1690,7 +1693,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
        {
          (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
                                 abfd, r_symndx);
-         return FALSE;
+         goto error_return;
        }
 
       if (r_symndx < symtab_hdr->sh_info)
@@ -1699,7 +1702,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
          isym = bfd_sym_from_r_symndx (&htab->sym_cache,
                                        abfd, r_symndx);
          if (isym == NULL)
-           return FALSE;
+           goto error_return;
 
          /* Check relocation against local STT_GNU_IFUNC symbol.  */
          if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
@@ -1707,7 +1710,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
              h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
                                                 TRUE);
              if (h == NULL)
-               return FALSE;
+               goto error_return;
 
              /* Fake a STT_GNU_IFUNC symbol.  */
              h->type = STT_GNU_IFUNC;
@@ -1755,7 +1758,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                     "supported in x32 mode"), abfd,
                   x86_64_elf_howto_table[r_type].name, name);
                bfd_set_error (bfd_error_bad_value);
-               return FALSE;
+               goto error_return;
              }
            break;
          }
@@ -1808,7 +1811,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                          || !bfd_set_section_alignment (htab->elf.dynobj,
                                                         htab->plt_bnd,
                                                         plt_bnd_align))
-                       return FALSE;
+                       goto error_return;
                    }
                }
 
@@ -1824,7 +1827,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
              if (h->type == STT_GNU_IFUNC
                  && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
                                                      info))
-               return FALSE;
+               goto error_return;
              break;
            }
 
@@ -1841,7 +1844,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                                       symtab_hdr, sym_hashes,
                                       &r_type, GOT_UNKNOWN,
                                       rel, rel_end, h, r_symndx))
-       return FALSE;
+       goto error_return;
 
       eh = (struct elf_x86_64_link_hash_entry *) h;
       switch (r_type)
@@ -1908,7 +1911,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                    local_got_refcounts = ((bfd_signed_vma *)
                                           bfd_zalloc (abfd, size));
                    if (local_got_refcounts == NULL)
-                     return FALSE;
+                     goto error_return;
                    elf_local_got_refcounts (abfd) = local_got_refcounts;
                    elf_x86_64_local_tlsdesc_gotent (abfd)
                      = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
@@ -1942,7 +1945,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                      (_("%B: '%s' accessed both as normal and thread local symbol"),
                       abfd, name);
                    bfd_set_error (bfd_error_bad_value);
-                   return FALSE;
+                   goto error_return;
                  }
              }
 
@@ -1968,7 +1971,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                htab->elf.dynobj = abfd;
              if (!_bfd_elf_create_got_section (htab->elf.dynobj,
                                                info))
-               return FALSE;
+               goto error_return;
            }
          break;
 
@@ -2136,7 +2139,7 @@ do_size:
                     abfd, /*rela?*/ TRUE);
 
                  if (sreloc == NULL)
-                   return FALSE;
+                   goto error_return;
                }
 
              /* If this is a global symbol, we count the number of
@@ -2154,7 +2157,7 @@ do_size:
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
                                                abfd, r_symndx);
                  if (isym == NULL)
-                   return FALSE;
+                   goto error_return;
 
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
                  if (s == NULL)
@@ -2174,7 +2177,7 @@ do_size:
                  p = ((struct elf_dyn_relocs *)
                       bfd_alloc (htab->elf.dynobj, amt));
                  if (p == NULL)
-                   return FALSE;
+                   goto error_return;
                  p->next = *head;
                  *head = p;
                  p->sec = sec;
@@ -2193,7 +2196,7 @@ do_size:
             Reconstruct it for later use during GC.  */
        case R_X86_64_GNU_VTINHERIT:
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-           return FALSE;
+           goto error_return;
          break;
 
          /* This relocation describes which C++ vtable entries are actually
@@ -2202,7 +2205,7 @@ do_size:
          BFD_ASSERT (h != NULL);
          if (h != NULL
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-           return FALSE;
+           goto error_return;
          break;
 
        default:
@@ -2240,7 +2243,7 @@ do_size:
              || !bfd_set_section_alignment (htab->elf.dynobj,
                                             htab->plt_got,
                                             plt_got_align))
-           return FALSE;
+           goto error_return;
        }
 
       if ((r_type == R_X86_64_GOTPCREL
@@ -2251,6 +2254,10 @@ do_size:
     }
 
   return TRUE;
+
+error_return:
+  sec->check_relocs_failed = 1;
+  return FALSE;
 }
 
 /* Return the section that should be marked against GC for a given