aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1994-01-21 05:47:18 +0000
committerIan Lance Taylor <ian@airs.com>1994-01-21 05:47:18 +0000
commit5e6cd559cfa7fd45d9f128903d1f42344bcfd03d (patch)
tree8c2bc8c2f21ca89521445694f7b7a2cecaa194a5 /ld
parentdc3da58f2ca3acb37293ec4b47fdcf3bc20ce7df (diff)
downloadgdb-5e6cd559cfa7fd45d9f128903d1f42344bcfd03d.zip
gdb-5e6cd559cfa7fd45d9f128903d1f42344bcfd03d.tar.gz
gdb-5e6cd559cfa7fd45d9f128903d1f42344bcfd03d.tar.bz2
* 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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog6
-rw-r--r--ld/ldlang.c26
2 files changed, 29 insertions, 3 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 097380b..b71b3d2 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 48db460..4c818cd 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -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;
}