* ldlang.h (ldlang_add_undef): Add cmdline param.
authorAlan Modra <amodra@gmail.com>
Thu, 28 Oct 2010 06:45:33 +0000 (06:45 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 28 Oct 2010 06:45:33 +0000 (06:45 +0000)
* ldlang.c (undef_from_cmdline): New var.
(ldlang_add_undef): Add cmdline param.  Set undef_from_cmdline.
(lang_end): Really require -e or -u from command line on
relocatable --gc-sections.
* ldemul.c (after_parse_default): Adjust ldlang_add_undef call.
* ldgram.y (extern_name_list_body): Likewise.
* lexsup.c (parse_args): Likewise.
* emultempl/aix.em (gld${EMULATION_NAME}_read_file): Likewise.

ld/ChangeLog
ld/emultempl/aix.em
ld/ldemul.c
ld/ldgram.y
ld/ldlang.c
ld/ldlang.h
ld/lexsup.c

index a82f4d78dc1d7d64801952d9162c63462064f5a4..650e0a7234bc01712b98f57c81045d50e4984652 100644 (file)
@@ -1,3 +1,15 @@
+2010-10-28  Alan Modra  <amodra@gmail.com>
+
+       * ldlang.h (ldlang_add_undef): Add cmdline param.
+       * ldlang.c (undef_from_cmdline): New var.
+       (ldlang_add_undef): Add cmdline param.  Set undef_from_cmdline.
+       (lang_end): Really require -e or -u from command line on
+       relocatable --gc-sections.
+       * ldemul.c (after_parse_default): Adjust ldlang_add_undef call.
+       * ldgram.y (extern_name_list_body): Likewise.
+       * lexsup.c (parse_args): Likewise.
+       * emultempl/aix.em (gld${EMULATION_NAME}_read_file): Likewise.
+
 2010-10-25  Alan Modra  <amodra@gmail.com>
 
        * plugin.c (plugin_get_ir_dummy_bfd): Set bfd_use_reserved_id.
index 497f51de98bb167ae8113811f2427504000c4ecf..4dc36c305093da4bb43a2259a1b428918419b878 100644 (file)
@@ -1193,7 +1193,7 @@ gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
            {
              struct export_symbol_list *n;
 
-             ldlang_add_undef (symname);
+             ldlang_add_undef (symname, TRUE);
              n = ((struct export_symbol_list *)
                   xmalloc (sizeof (struct export_symbol_list)));
              n->next = export_symbols;
index c77eeb0eb54cdb453f9b8071bb7772069e685236..f1f3979578a81bf4418219011b0221615cdbc0a5 100644 (file)
@@ -219,7 +219,7 @@ after_parse_default (void)
          is_vma = *send == '\0';
        }
       if (!is_vma)
-       ldlang_add_undef (entry_symbol.name);
+       ldlang_add_undef (entry_symbol.name, entry_from_cmdline);
     }
 }
 
index 49d9ff1bc3a658a6cb7ccc0c75ccbaa89984a120..69a84c72982b8b181695c4ed8b98d92555033cc8 100644 (file)
@@ -287,11 +287,11 @@ extern_name_list:
 
 extern_name_list_body:
          NAME
-                       { ldlang_add_undef ($1); }
+                       { ldlang_add_undef ($1, FALSE); }
        | extern_name_list_body NAME
-                       { ldlang_add_undef ($2); }
+                       { ldlang_add_undef ($2, FALSE); }
        | extern_name_list_body ',' NAME
-                       { ldlang_add_undef ($3); }
+                       { ldlang_add_undef ($3, FALSE); }
        ;
 
 script_file:
index 2bb2e93cd475bcd93e748d4ac74c56132793d3f2..95ef5f5d9600de462d0bf4eb65610c3a0525952f 100644 (file)
@@ -101,6 +101,7 @@ lang_statement_list_type input_file_chain;
 struct bfd_sym_chain entry_symbol = { NULL, NULL };
 const char *entry_section = ".text";
 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;
@@ -3297,11 +3298,12 @@ 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)
+ldlang_add_undef (const char *const name, bfd_boolean cmdline)
 {
-  ldlang_undef_chain_list_type *new_undef = (ldlang_undef_chain_list_type *)
-      stat_alloc (sizeof (ldlang_undef_chain_list_type));
+  ldlang_undef_chain_list_type *new_undef;
 
+  undef_from_cmdline = undef_from_cmdline || cmdline;
+  new_undef = (ldlang_undef_chain_list_type *) stat_alloc (sizeof (*new_undef));
   new_undef->next = ldlang_undef_chain_list_head;
   ldlang_undef_chain_list_head = new_undef;
 
@@ -5583,8 +5585,7 @@ lang_end (void)
   /* Force the user to specify a root when generating a relocatable with
      --gc-sections.  */
   if (link_info.gc_sections && link_info.relocatable
-      && (entry_symbol.name == NULL
-         && ldlang_undef_chain_list_head == NULL))
+      && !(entry_from_cmdline || undef_from_cmdline))
     einfo (_("%P%F: gc-sections requires either an entry or "
             "an undefined symbol\n"));
 
index f89eb53b64354c5755018c6a3e99457129f2d8f5..0b7b43b4151a26fc3bf814f3a970848095b841cb 100644 (file)
@@ -568,7 +568,7 @@ extern lang_output_section_statement_type *lang_output_section_statement_lookup
 extern lang_output_section_statement_type *next_matching_output_section_statement
   (lang_output_section_statement_type *, int);
 extern void ldlang_add_undef
-  (const char *const);
+  (const char *const, bfd_boolean);
 extern void lang_add_output_format
   (const char *, const char *, const char *, int);
 extern void lang_list_init
index 0c44151bac084ea9a01b79cb819a95991a95e62c..39ca32683b1244dcce84f03c39a1102769fcbbe5 100644 (file)
@@ -1307,7 +1307,7 @@ parse_args (unsigned argc, char **argv)
          config.dynamic_link = FALSE;
          break;
        case 'u':
-         ldlang_add_undef (optarg);
+         ldlang_add_undef (optarg, TRUE);
          break;
        case OPTION_UNIQUE:
          if (optarg != NULL)