From f400bbbb4f5a7209fb97c42abbc4ef79d1ba6cfb Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 18 Mar 1995 06:53:14 +0000 Subject: [PATCH] * ldlang.c (load_symbols): An empty is archive is OK. --- ld/ChangeLog | 9 +++++++++ ld/ldlang.c | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index ed55c612705..3472833b557 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +Sat Mar 18 01:49:14 1995 Ian Lance Taylor + + * ldlang.c (load_symbols): An empty is archive is OK. + +Fri Mar 17 16:15:31 1995 Stan Shebs + + * ldmain.c (progress.h): Include. + (main): Call START_PROGRESS and END_PROGRESS. + Thu Mar 16 17:17:33 1995 Michael Meissner * scripttempl/elfppc.sc: Move _GOT2_END_ after the .ctors and diff --git a/ld/ldlang.c b/ld/ldlang.c index bd71f2bf0aa..61ad502de65 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, -- 2.30.2