]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - binutils/binemul.c
Imported binutils-2.20
[msp430-binutils.git] / binutils / binemul.c
index 0eb1c816c1aeddd8d30ad89f9bb2c9db5c5202ff..2931bdac799b1511c6212fd0b2f8b0619b6df048 100644 (file)
@@ -1,5 +1,5 @@
 /* Binutils emulation layer.
 /* Binutils emulation layer.
-   Copyright 2002, 2003, 2007 Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
@@ -39,29 +39,58 @@ ar_emul_default_usage (FILE *fp)
 }
 
 bfd_boolean
 }
 
 bfd_boolean
-ar_emul_append (bfd **after_bfd, char *file_name, bfd_boolean verbose)
+ar_emul_append (bfd **after_bfd, char *file_name, bfd_boolean verbose,
+                bfd_boolean flatten)
 {
   if (bin_dummy_emulation.ar_append)
 {
   if (bin_dummy_emulation.ar_append)
-    return bin_dummy_emulation.ar_append (after_bfd, file_name, verbose);
+    return bin_dummy_emulation.ar_append (after_bfd, file_name, verbose,
+                                          flatten);
 
   return FALSE;
 }
 
 
   return FALSE;
 }
 
+static bfd_boolean
+do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
+                       bfd_boolean verbose, bfd_boolean flatten)
+  {
+  /* When flattening, add the members of an archive instead of the
+     archive itself.  */
+  if (flatten && bfd_check_format (new_bfd, bfd_archive))
+    {
+      bfd *elt;
+      bfd_boolean added = FALSE;
+
+      for (elt = bfd_openr_next_archived_file (new_bfd, NULL);
+           elt;
+           elt = bfd_openr_next_archived_file (new_bfd, elt))
+        {
+          if (do_ar_emul_default_append (after_bfd, elt, verbose, TRUE))
+            {
+              added = TRUE;
+              after_bfd = &((*after_bfd)->archive_next);
+            }
+        }
+
+      return added;
+    }
+
+  AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
+
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
+
+  return TRUE;
+}
+
 bfd_boolean
 ar_emul_default_append (bfd **after_bfd, char *file_name,
 bfd_boolean
 ar_emul_default_append (bfd **after_bfd, char *file_name,
-                       bfd_boolean verbose)
+                       bfd_boolean verbose, bfd_boolean flatten)
 {
 {
-  bfd *temp;
+  bfd *new_bfd;
 
 
-  temp = *after_bfd;
-  *after_bfd = bfd_openr (file_name, NULL);
-
-  AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name);
-  AR_EMUL_APPEND_PRINT_VERBOSE (verbose, file_name);
-
-  (*after_bfd)->archive_next = temp;
-
-  return TRUE;
+  new_bfd = bfd_openr (file_name, NULL);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
+  return do_ar_emul_default_append (after_bfd, new_bfd, verbose, flatten);
 }
 
 bfd_boolean
 }
 
 bfd_boolean