diff options
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r-- | bfd/cofflink.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c index a29b687..a28d396 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -197,7 +197,8 @@ coff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) static bfd_boolean coff_link_check_ar_symbols (bfd *abfd, struct bfd_link_info *info, - bfd_boolean *pneeded) + bfd_boolean *pneeded, + bfd **subsbfd) { bfd_size_type symesz; bfd_byte *esym; @@ -243,7 +244,8 @@ coff_link_check_ar_symbols (bfd *abfd, if (h != (struct bfd_link_hash_entry *) NULL && h->type == bfd_link_hash_undefined) { - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) + if (! (*info->callbacks->add_archive_element) + (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -267,14 +269,23 @@ coff_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, bfd_boolean *pneeded) { + bfd *subsbfd = NULL; + if (! _bfd_coff_get_external_symbols (abfd)) return FALSE; - if (! coff_link_check_ar_symbols (abfd, info, pneeded)) + if (! coff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd)) + return FALSE; + + /* Potentially, the add_archive_element hook may have set a + substitute BFD for us. */ + if (*pneeded + && subsbfd + && ! _bfd_coff_get_external_symbols (subsbfd)) return FALSE; if (*pneeded - && ! coff_link_add_symbols (abfd, info)) + && ! coff_link_add_symbols (subsbfd ? subsbfd : abfd, info)) return FALSE; if ((! info->keep_memory || ! *pneeded) |