gas: blackfin: add tests for recent loop label fixes
[deliverable/binutils-gdb.git] / bfd / xcofflink.c
index 58f5f44426bd06dbd657cca57712d33d91fcfb7a..c055b260d6a5b4b0f012b74186dba9453ddcefae 100644 (file)
@@ -1,6 +1,6 @@
 /* POWER/PowerPC XCOFF linker support.
    Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -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;
@@ -3976,7 +3985,9 @@ bfd_xcoff_link_generate_rtinit (bfd *abfd,
   abfd->format = bfd_object;
   abfd->iostream = (void *) bim;
   abfd->flags = BFD_IN_MEMORY;
+  abfd->iovec = &_bfd_memory_iovec;
   abfd->direction = write_direction;
+  abfd->origin = 0;
   abfd->where = 0;
 
   if (! bfd_xcoff_generate_rtinit (abfd, init, fini, rtld))
@@ -5872,10 +5883,13 @@ _bfd_xcoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
 
              o->reloc_count += sec->reloc_count;
 
-             if (sec->rawsize > max_contents_size)
-               max_contents_size = sec->rawsize;
-             if (sec->size > max_contents_size)
-               max_contents_size = sec->size;
+             if ((sec->flags & SEC_IN_MEMORY) == 0)
+               {
+                 if (sec->rawsize > max_contents_size)
+                   max_contents_size = sec->rawsize;
+                 if (sec->size > max_contents_size)
+                   max_contents_size = sec->size;
+               }
              if (coff_section_data (sec->owner, sec) != NULL
                  && xcoff_section_data (sec->owner, sec) != NULL
                  && (xcoff_section_data (sec->owner, sec)->lineno_count
This page took 0.025715 seconds and 4 git commands to generate.