Applied patch series for LD plugin interface (six parts).
[deliverable/binutils-gdb.git] / bfd / cofflink.c
index a29b68795049c613d865f8133a02dcded1485cbf..a28d396919aba4017396a60db5f2cd3fca52a343 100644 (file)
@@ -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)
This page took 0.025202 seconds and 4 git commands to generate.