PR26265, Spurious 'gc-sections requires ... when --init or --fini
authorAlan Modra <amodra@gmail.com>
Mon, 20 Jul 2020 04:02:34 +0000 (13:32 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 20 Jul 2020 12:51:11 +0000 (22:21 +0930)
bfd/
* elflink.c (_bfd_elf_gc_keep): Use bfd_is_const_section.
ld/
PR 26265
* ldlang.c (undef_from_cmdline): Delete.
(ldlang_add_undef): Mark "cmdline" param unused.
(lang_end): Traverse gc_sym_list to determine whether a symbol root
has been specified.  Update error message.
* testsuite/ld-gc/noent.d: Adjust for changed error message.

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/ldlang.c
ld/testsuite/ld-gc/noent.d

index 43326b548ef40e1bd8a8bebdcded079dfe89c648..d6a1d87e5e77595b7dc1fa11d15df2271bae4c81 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-20  Alan Modra  <amodra@gmail.com>
+
+       * elflink.c (_bfd_elf_gc_keep): Use bfd_is_const_section.
+
 2020-07-19  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (struct ppc_link_hash_table): Add has_power10_relocs.
index 6978df56db3676f39949b94e4a9c55c648a8ab31..286fc1125056f3a28617a3de4f1f4c5256dafed2 100644 (file)
@@ -13779,8 +13779,7 @@ _bfd_elf_gc_keep (struct bfd_link_info *info)
       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)
-         && !bfd_is_und_section (h->root.u.def.section))
+         && !bfd_is_const_section (h->root.u.def.section))
        h->root.u.def.section->flags |= SEC_KEEP;
     }
 }
index 339fa785e288ef0b6e27a2f2695ad5c1f79bece7..13c25fa26a3a9b5cd044868c89e78684bb1ef3de 100644 (file)
@@ -1,3 +1,12 @@
+2020-07-20  Alan Modra  <amodra@gmail.com>
+
+       PR 26265
+       * ldlang.c (undef_from_cmdline): Delete.
+       (ldlang_add_undef): Mark "cmdline" param unused.
+       (lang_end): Traverse gc_sym_list to determine whether a symbol root
+       has been specified.  Update error message.
+       * testsuite/ld-gc/noent.d: Adjust for changed error message.
+
 2020-07-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/26263
index 23e787a3b22d0fa83ea7ec4245a4046865dc2bcc..2b3a5f9069c0ddc4422b6111e1d3af3b9d11633d 100644 (file)
@@ -123,7 +123,6 @@ struct bfd_sym_chain entry_symbol = { NULL, NULL };
 const char *entry_section = ".text";
 struct lang_input_statement_flags input_flags;
 bfd_boolean entry_from_cmdline;
-bfd_boolean undef_from_cmdline;
 bfd_boolean lang_has_input_file = FALSE;
 bfd_boolean had_output_filename = FALSE;
 bfd_boolean lang_float_flag = FALSE;
@@ -3895,11 +3894,10 @@ typedef struct bfd_sym_chain ldlang_undef_chain_list_type;
 #define ldlang_undef_chain_list_head entry_symbol.next
 
 void
-ldlang_add_undef (const char *const name, bfd_boolean cmdline)
+ldlang_add_undef (const char *const name, bfd_boolean cmdline ATTRIBUTE_UNUSED)
 {
   ldlang_undef_chain_list_type *new_undef;
 
-  undef_from_cmdline = undef_from_cmdline || cmdline;
   new_undef = stat_alloc (sizeof (*new_undef));
   new_undef->next = ldlang_undef_chain_list_head;
   ldlang_undef_chain_list_head = new_undef;
@@ -6839,10 +6837,24 @@ lang_end (void)
      --gc-sections, unless --gc-keep-exported was also given.  */
   if (bfd_link_relocatable (&link_info)
       && link_info.gc_sections
-      && !link_info.gc_keep_exported
-      && !(entry_from_cmdline || undef_from_cmdline))
-    einfo (_("%F%P: gc-sections requires either an entry or "
-            "an undefined symbol\n"));
+      && !link_info.gc_keep_exported)
+    {
+      struct bfd_sym_chain *sym;
+
+      for (sym = link_info.gc_sym_list; sym != NULL; sym = sym->next)
+       {
+         h = bfd_link_hash_lookup (link_info.hash, sym->name,
+                                   FALSE, FALSE, FALSE);
+         if (h != NULL
+             && (h->type == bfd_link_hash_defined
+                 || h->type == bfd_link_hash_defweak)
+             && !bfd_is_const_section (h->u.def.section))
+           break;
+       }
+      if (!sym)
+       einfo (_("%F%P: --gc-sections requires a defined symbol root "
+                "specified by -e or -u\n"));
+    }
 
   if (entry_symbol.name == NULL)
     {
index 1741a744520969a27c75aa80a9b854c376552625..49808229b13b8002f11e7052bc3dd768ac85c8b6 100644 (file)
@@ -1,3 +1,3 @@
 # name: --gc-sections -r without -e
 # ld: --gc-sections -r
-# error: gc-sections requires either an entry or an undefined symbol
+# error: --gc-sections requires .*