* ldlang.c (new_afile): Initialize loaded field to false.
authorIan Lance Taylor <ian@airs.com>
Fri, 21 Jan 1994 05:47:18 +0000 (05:47 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 21 Jan 1994 05:47:18 +0000 (05:47 +0000)
(lookup_name): If file was already loaded, don't call the
add_symbols entry point again.

ld/ChangeLog
ld/ldlang.c

index 097380bf878f888ddfcd645cf508fa8934c90b05..b71b3d2b7104e3746f265983f8ade13335893e56 100644 (file)
@@ -1,3 +1,9 @@
+Fri Jan 21 00:44:44 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
+
+       * ldlang.c (new_afile): Initialize loaded field to false.
+       (lookup_name): If file was already loaded, don't call the
+       add_symbols entry point again.
+
 Wed Jan 19 13:57:00 1994  David J. Mackenzie  (djm@thepub.cygnus.com)
 
        * ld.texinfo: Clarify what -T option does.
index 48db4607fcf57f8e551201d9e69f2bb89205dcef..4c818cd04734a29b246d4bb2c06e351a83fff05d 100644 (file)
@@ -368,6 +368,7 @@ new_afile (name, file_type, target)
   p->next = (lang_statement_union_type *) NULL;
   p->symbol_count = 0;
   p->common_output_section = (asection *) NULL;
+  p->loaded = false;
   lang_statement_append (&input_file_chain,
                         (lang_statement_union_type *) p,
                         &p->next_real_file);
@@ -775,10 +776,22 @@ lookup_name (name)
       search = new_afile (name, lang_input_file_is_file_enum, default_target);
     }
 
+  /* If we have already added this file, or this file is not real
+     (FIXME: can that ever actually happen?) or the name is NULL
+     (FIXME: can that ever actually happen?) don't add this file.  */
+  if (search->loaded
+      || ! search->real
+      || search->filename == (const char *) NULL)
+    return search;
+
   ldfile_open_file (search);
 
   if (bfd_check_format (search->the_bfd, bfd_object))
-    ldlang_add_file (search);
+    {
+      ldlang_add_file (search);
+      if (trace_files || trace_file_tries)
+       info_msg ("%I\n", search);
+    }
   else if (bfd_check_format (search->the_bfd, bfd_archive))
     {
       /* There is nothing to do here; the add_symbols routine will
@@ -791,6 +804,8 @@ lookup_name (name)
   if (bfd_link_add_symbols (search->the_bfd, &link_info) == false)
     einfo ("%F%B: could not read symbols: %E\n", search->the_bfd);
 
+  search->loaded = true;
+
   return search;
 }
 
@@ -2281,6 +2296,8 @@ void
 ldlang_add_file (entry)
      lang_input_statement_type * entry;
 {
+  bfd **pp;
+
   lang_statement_append (&file_chain,
                         (lang_statement_union_type *) entry,
                         &entry->next);
@@ -2289,8 +2306,11 @@ ldlang_add_file (entry)
      a link.  */
   ASSERT (entry->the_bfd->link_next == (bfd *) NULL);
   ASSERT (entry->the_bfd != output_bfd);
-  entry->the_bfd->link_next = link_info.input_bfds;
-  link_info.input_bfds = entry->the_bfd;
+  for (pp = &link_info.input_bfds;
+       *pp != (bfd *) NULL;
+       pp = &(*pp)->link_next)
+    ;
+  *pp = entry->the_bfd;
   entry->the_bfd->usrdata = (PTR) entry;
 }