* ldlang.c (ldlang_add_undef): If the output bfd has been opened,
authorAlan Modra <amodra@gmail.com>
Wed, 20 Mar 2002 07:49:53 +0000 (07:49 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 20 Mar 2002 07:49:53 +0000 (07:49 +0000)
add the symbol to the linker hash table immediately.
(lang_place_undefineds): Split symbol creation out..
(insert_undefined): ..to here.

ld/ChangeLog
ld/ldlang.c

index 3b5588430ff19efa9b6d3e11b02eda87876eac8f..dda0b4015b4910d5d1c38fd2ef6292fb6b3dc0d2 100644 (file)
@@ -1,3 +1,10 @@
+2002-03-20  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldlang.c (ldlang_add_undef): If the output bfd has been opened,
+       add the symbol to the linker hash table immediately.
+       (lang_place_undefineds): Split symbol creation out..
+       (insert_undefined): ..to here.
+
 2002-03-18  David O'Brien  <obrien@FreeBSD.org>
 
        * emultempl/elf32.em: Use lbasename vs. basename to fix problem where
index b176f2d86cbaf3726c3d9d55fc71a48a0f020f50..83f6317353e5843252b25507785b48af55fde85e 100644 (file)
@@ -92,6 +92,7 @@ static bfd *open_output PARAMS ((const char *));
 static void ldlang_open_output PARAMS ((lang_statement_union_type *));
 static void open_input_bfds PARAMS ((lang_statement_union_type *, boolean));
 static void lang_reasonable_defaults PARAMS ((void));
+static void insert_undefined PARAMS ((const char *));
 static void lang_place_undefineds PARAMS ((void));
 static void map_input_to_output_sections
   PARAMS ((lang_statement_union_type *, const char *,
@@ -2010,7 +2011,11 @@ lang_reasonable_defaults ()
 }
 
 /* Add the supplied name to the symbol table as an undefined reference.
-   Remove items from the chain as we open input bfds.  */
+   This is a two step process as the symbol table doesn't even exist at
+   the time the ld command line is processed.  First we put the name
+   on a list, then, once the output file has been opened, transfer the
+   name to the symbol table.  */
+
 typedef struct ldlang_undef_chain_list
 {
   struct ldlang_undef_chain_list *next;
@@ -2031,6 +2036,28 @@ ldlang_add_undef (name)
   ldlang_undef_chain_list_head = new;
 
   new->name = xstrdup (name);
+
+  if (output_bfd != NULL)
+    insert_undefined (new->name);
+}
+
+/* Insert NAME as undefined in the symbol table.  */
+
+static void
+insert_undefined (name)
+     const char *name;
+{
+  struct bfd_link_hash_entry *h;
+
+  h = bfd_link_hash_lookup (link_info.hash, name, true, false, true);
+  if (h == (struct bfd_link_hash_entry *) NULL)
+    einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
+  if (h->type == bfd_link_hash_new)
+    {
+      h->type = bfd_link_hash_undefined;
+      h->u.undef.abfd = NULL;
+      bfd_link_add_undef (link_info.hash, h);
+    }
 }
 
 /* Run through the list of undefineds created above and place them
@@ -2046,17 +2073,7 @@ lang_place_undefineds ()
        ptr != (ldlang_undef_chain_list_type *) NULL;
        ptr = ptr->next)
     {
-      struct bfd_link_hash_entry *h;
-
-      h = bfd_link_hash_lookup (link_info.hash, ptr->name, true, false, true);
-      if (h == (struct bfd_link_hash_entry *) NULL)
-       einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
-      if (h->type == bfd_link_hash_new)
-       {
-         h->type = bfd_link_hash_undefined;
-         h->u.undef.abfd = NULL;
-         bfd_link_add_undef (link_info.hash, h);
-       }
+      insert_undefined (ptr->name);
     }
 }