From 3d0c8fa1d4625ec58db6d67f292cfd16af9bfd7e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 4 Mar 1996 19:12:43 +0000 Subject: [PATCH] * ldlang.c (wild): Handle foo.a(.text) by mapping each included member of foo.a separately. From Jouke Numan . --- ld/ChangeLog | 5 +++++ ld/ldlang.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 37b48f472c6..31f1b21d7b6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +Mon Mar 4 14:11:17 1996 Ian Lance Taylor + + * ldlang.c (wild): Handle foo.a(.text) by mapping each included + member of foo.a separately. From Jouke Numan . + Fri Mar 1 10:24:59 1996 Andreas Schwab * emultempl/elf32.em (gld${EMULATION_NAME}_find_exp_assignment): diff --git a/ld/ldlang.c b/ld/ldlang.c index 2c67d274f92..dc3eaeeab61 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -881,7 +881,34 @@ wild (s, section, file, target, output) else { /* Perform the iteration over a single file */ - wild_section (s, section, lookup_name (file), output); + f = lookup_name (file); + if (f->the_bfd == NULL + || ! bfd_check_format (f->the_bfd, bfd_archive)) + wild_section (s, section, f, output); + else + { + bfd *member; + + /* This is an archive file. We must map each member of the + archive separately. */ + member = bfd_openr_next_archived_file (f->the_bfd, (bfd *) NULL); + while (member != NULL) + { + /* When lookup_name is called, it will call the + add_symbols entry point for the archive. For each + element of the archive which is included, BFD will + call ldlang_add_file, which will set the usrdata + field of the member to the lang_input_statement. */ + if (member->usrdata != NULL) + { + wild_section (s, section, + (lang_input_statement_type *) member->usrdata, + output); + } + + member = bfd_openr_next_archived_file (f->the_bfd, member); + } + } } if (section != (char *) NULL && strcmp (section, "COMMON") == 0