summaryrefslogtreecommitdiff
path: root/bfd/cofflink.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r--bfd/cofflink.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index a29b687950..a28d396919 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)