Applied patch series for LD plugin interface (six parts).
[deliverable/binutils-gdb.git] / bfd / xcofflink.c
index 30923cfba435e7d578d3ce276b0df1a7c278b325..c055b260d6a5b4b0f012b74186dba9453ddcefae 100644 (file)
@@ -2233,7 +2233,8 @@ xcoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
 static bfd_boolean
 xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
                                     struct bfd_link_info *info,
-                                    bfd_boolean *pneeded)
+                                    bfd_boolean *pneeded,
+                                    bfd **subsbfd)
 {
   asection *lsec;
   bfd_byte *contents;
@@ -2291,7 +2292,8 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
          && (((struct xcoff_link_hash_entry *) h)->flags
              & XCOFF_DEF_DYNAMIC) == 0)
        {
-         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;
@@ -2314,7 +2316,8 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
 static bfd_boolean
 xcoff_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;
@@ -2325,7 +2328,7 @@ xcoff_link_check_ar_symbols (bfd *abfd,
   if ((abfd->flags & DYNAMIC) != 0
       && ! info->static_link
       && info->output_bfd->xvec == abfd->xvec)
-    return xcoff_link_check_dynamic_ar_symbols (abfd, info, pneeded);
+    return xcoff_link_check_dynamic_ar_symbols (abfd, info, pneeded, subsbfd);
 
   symesz = bfd_coff_symesz (abfd);
   esym = (bfd_byte *) obj_coff_external_syms (abfd);
@@ -2361,7 +2364,8 @@ xcoff_link_check_ar_symbols (bfd *abfd,
                  || (((struct xcoff_link_hash_entry *) h)->flags
                      & XCOFF_DEF_DYNAMIC) == 0))
            {
-             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;
@@ -2386,17 +2390,22 @@ xcoff_link_check_archive_element (bfd *abfd,
                                  bfd_boolean *pneeded)
 {
   bfd_boolean keep_syms_p;
+  bfd *subsbfd = NULL;
 
   keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
   if (! _bfd_coff_get_external_symbols (abfd))
     return FALSE;
 
-  if (! xcoff_link_check_ar_symbols (abfd, info, pneeded))
+  if (! xcoff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd))
     return FALSE;
 
   if (*pneeded)
     {
-      if (! xcoff_link_add_symbols (abfd, info))
+      /* Potentially, the add_archive_element hook may have set a
+        substitute BFD for us.  */
+      if (subsbfd && !_bfd_coff_get_external_symbols (subsbfd))
+       return FALSE;
+      if (! xcoff_link_add_symbols (subsbfd ? subsbfd : abfd, info))
        return FALSE;
       if (info->keep_memory)
        keep_syms_p = TRUE;
This page took 0.033437 seconds and 4 git commands to generate.