aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-03-18 06:53:14 +0000
committerIan Lance Taylor <ian@airs.com>1995-03-18 06:53:14 +0000
commitf400bbbb4f5a7209fb97c42abbc4ef79d1ba6cfb (patch)
treea50c14c5db955fac76d043ba655dad7859f26baf /ld/ldlang.c
parentf64fd87f2b0d273ce0d7f67461eb8d039c982fd7 (diff)
downloadgdb-f400bbbb4f5a7209fb97c42abbc4ef79d1ba6cfb.zip
gdb-f400bbbb4f5a7209fb97c42abbc4ef79d1ba6cfb.tar.gz
gdb-f400bbbb4f5a7209fb97c42abbc4ef79d1ba6cfb.tar.bz2
* ldlang.c (load_symbols): An empty is archive is OK.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index bd71f2b..61ad502 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -802,11 +802,40 @@ load_symbols (entry, place)
add_symbols entry point will call ldlang_add_file, via the
add_archive_element callback, for each element of the archive
which is used. */
- if (bfd_get_format (entry->the_bfd) == bfd_object)
+ switch (bfd_get_format (entry->the_bfd))
{
+ default:
+ break;
+
+ case bfd_object:
ldlang_add_file (entry);
if (trace_files || trace_file_tries)
info_msg ("%I\n", entry);
+ break;
+
+ case bfd_archive:
+ if (whole_archive)
+ {
+ bfd *member = bfd_openr_next_archived_file (entry->the_bfd,
+ (bfd *) NULL);
+ while (member != NULL)
+ {
+ if (! bfd_check_format (member, bfd_object))
+ einfo ("%F%B: object %B in archive is not object\n",
+ entry->the_bfd, member);
+ if (! ((*link_info.callbacks->add_archive_element)
+ (&link_info, member, "-whole-archive")))
+ abort ();
+ if (! bfd_link_add_symbols (member, &link_info))
+ einfo ("%F%B: could not read symbols: %E\n", member);
+ member = bfd_openr_next_archived_file (entry->the_bfd,
+ member);
+ }
+
+ entry->loaded = true;
+
+ return;
+ }
}
if (! bfd_link_add_symbols (entry->the_bfd, &link_info))
@@ -2188,7 +2217,8 @@ lang_finish ()
}
/* Check that the architecture of all the input files is compatible
- with the output file. */
+ with the output file. Also call the backend to let it do any
+ other checking that is needed. */
static void
lang_check ()
@@ -2208,6 +2238,9 @@ lang_check ()
einfo ("%P: warning: %s architecture of input file `%B' is incompatible with %s output\n",
bfd_printable_name (input_bfd), input_bfd,
bfd_printable_name (output_bfd));
+
+ else
+ bfd_merge_private_bfd_data (input_bfd, output_bfd);
}
}
@@ -2249,14 +2282,14 @@ lang_one_common (h, info)
return true;
size = h->u.c.size;
- power_of_two = h->u.c.alignment_power;
+ power_of_two = h->u.c.p->alignment_power;
if (config.sort_common
&& power_of_two < *(unsigned int *) info
&& *(unsigned int *) info < 4)
return true;
- section = h->u.c.section;
+ section = h->u.c.p->section;
/* Increase the size of the section. */
section->_raw_size = ALIGN_N (section->_raw_size,