Move ELF relocation check after lang_gc_sections
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 21 Apr 2016 00:06:58 +0000 (17:06 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 21 Apr 2016 00:08:55 +0000 (17:08 -0700)
Move ELF relocation check after lang_gc_sections so that all the
reference counting code for plt and got relocs can be removed.  This
only affects ELF targets which check relocations after opening all
input file.

* ldlang.c (lang_check_relocs): New function.
(lang_process): Call lang_check_relocs after lang_gc_sections.
* emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Don't
call _bfd_elf_link_check_relocs here.

ld/ChangeLog
ld/emultempl/elf32.em
ld/ldlang.c

index 1963c17..07209d5 100644 (file)
@@ -1,5 +1,12 @@
 2016-04-20  H.J. Lu  <hongjiu.lu@intel.com>
 
+       * ldlang.c (lang_check_relocs): New function.
+       (lang_process): Call lang_check_relocs after lang_gc_sections.
+       * emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Don't
+       call _bfd_elf_link_check_relocs here.
+
+2016-04-20  H.J. Lu  <hongjiu.lu@intel.com>
+
        PR ld/19972
        * testsuite/ld-elf/eh6.d: Pass -rW to readelf and check for
        R_386_NONE or R_X86_64_NONE.
index 312f935..4f5d1a4 100644 (file)
@@ -1026,20 +1026,6 @@ gld${EMULATION_NAME}_after_open (void)
   if (!is_elf_hash_table (htab))
     return;
 
-  if (link_info.check_relocs_after_open_input)
-    {
-      bfd *abfd;
-
-      for (abfd = link_info.input_bfds;
-          abfd != (bfd *) NULL; abfd = abfd->link.next)
-       if (!_bfd_elf_link_check_relocs (abfd, &link_info))
-         {
-           /* no object output, fail return */
-           config.make_executable = FALSE;
-           return;
-         }
-    }
-
   if (emit_note_gnu_build_id != NULL)
     {
       bfd *abfd;
index 856e3e2..2ae3640 100644 (file)
@@ -6778,6 +6778,27 @@ lang_add_gc_name (const char * name)
   link_info.gc_sym_list = sym;
 }
 
+/* Check relocations.  */
+
+static void
+lang_check_relocs (void)
+{
+  if (link_info.check_relocs_after_open_input
+      && bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
+    {
+      bfd *abfd;
+
+      for (abfd = link_info.input_bfds;
+          abfd != (bfd *) NULL; abfd = abfd->link.next)
+       if (!_bfd_elf_link_check_relocs (abfd, &link_info))
+         {
+           /* no object output, fail return */
+           config.make_executable = FALSE;
+           break;
+         }
+    }
+}
+
 void
 lang_process (void)
 {
@@ -6917,6 +6938,9 @@ lang_process (void)
   /* Remove unreferenced sections if asked to.  */
   lang_gc_sections ();
 
+  /* Check relocations.  */
+  lang_check_relocs ();
+
   /* Update wild statements.  */
   update_wild_statements (statement_list.head);