daily update
[deliverable/binutils-gdb.git] / bfd / format.c
index 9af6efcbab5c12cf477d41ffbf9bd7d85bba77a4..6a34dd2bea488b2b93bf7d34e8304f222ddcc8de 100644 (file)
@@ -1,6 +1,6 @@
 /* Generic BFD support for file formats.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002,
+   2003, 2005 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -17,7 +17,7 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /*
 SECTION
@@ -38,6 +38,8 @@ SECTION
 
        The BFD contains the result of an executable core dump.
 
+SUBSECTION
+       File format functions
 */
 
 #include "bfd.h"
@@ -86,9 +88,7 @@ DESCRIPTION
 */
 
 bfd_boolean
-bfd_check_format (abfd, format)
-     bfd *abfd;
-     bfd_format format;
+bfd_check_format (bfd *abfd, bfd_format format)
 {
   return bfd_check_format_matches (abfd, format, NULL);
 }
@@ -98,8 +98,8 @@ FUNCTION
        bfd_check_format_matches
 
 SYNOPSIS
-       bfd_boolean bfd_check_format_matches (bfd *abfd, bfd_format format,
-                                             char ***matching);
+       bfd_boolean bfd_check_format_matches
+         (bfd *abfd, bfd_format format, char ***matching);
 
 DESCRIPTION
        Like <<bfd_check_format>>, except when it returns FALSE with
@@ -114,10 +114,7 @@ DESCRIPTION
 */
 
 bfd_boolean
-bfd_check_format_matches (abfd, format, matching)
-     bfd *abfd;
-     bfd_format format;
-     char ***matching;
+bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
 {
   extern const bfd_target binary_vec;
   const bfd_target * const *target;
@@ -148,7 +145,7 @@ bfd_check_format_matches (abfd, format, matching)
 
       *matching = NULL;
       amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries;
-      matching_vector = (const bfd_target **) bfd_malloc (amt);
+      matching_vector = bfd_malloc (amt);
       if (!matching_vector)
        return FALSE;
     }
@@ -163,7 +160,11 @@ bfd_check_format_matches (abfd, format, matching)
   if (!abfd->target_defaulted)
     {
       if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)        /* rewind! */
-       return FALSE;
+       {
+         if (matching)
+           free (matching_vector);
+         return FALSE;
+       }
 
       right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
 
@@ -172,7 +173,15 @@ bfd_check_format_matches (abfd, format, matching)
          abfd->xvec = right_targ;      /* Set the target as returned.  */
 
          if (matching)
-           free ((PTR) matching_vector);
+           free (matching_vector);
+
+         /* If the file was opened for update, then `output_has_begun'
+            some time ago when the file was created.  Do not recompute
+            sections sizes or alignments in _bfd_set_section_contents.
+            We can not set this flag until after checking the format,
+            because it will interfere with creation of BFD sections.  */
+         if (abfd->direction == both_direction)
+           abfd->output_has_begun = TRUE;
 
          return TRUE;                  /* File position has moved, BTW.  */
        }
@@ -195,7 +204,7 @@ bfd_check_format_matches (abfd, format, matching)
          abfd->format = bfd_unknown;
 
          if (matching)
-           free ((PTR) matching_vector);
+           free (matching_vector);
 
          bfd_set_error (bfd_error_file_not_recognized);
 
@@ -208,13 +217,19 @@ bfd_check_format_matches (abfd, format, matching)
       const bfd_target *temp;
       bfd_error_type err;
 
-      if (*target == &binary_vec)
+      /* Don't check the default target twice.  */
+      if (*target == &binary_vec
+         || (!abfd->target_defaulted && *target == save_targ))
        continue;
 
       abfd->xvec = *target;    /* Change BFD's target temporarily.  */
 
       if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
-       return FALSE;
+       {
+         if (matching)
+           free (matching_vector);
+         return FALSE;
+       }
 
       /* If _bfd_check_format neglects to set bfd_error, assume
         bfd_error_wrong_format.  We didn't used to even pay any
@@ -242,16 +257,6 @@ bfd_check_format_matches (abfd, format, matching)
            matching_vector[match_count] = temp;
 
          match_count++;
-
-#ifdef GNU960
-         /* Big- and little-endian b.out archives look the same, but it
-            doesn't matter: there is no difference in their headers, and
-            member file byte orders will (I hope) be handled appropriately
-            by bfd.  Ditto for big and little coff archives.  And the 4
-            coff/b.out object formats are unambiguous.  So accept the
-            first match we find.  */
-         break;
-#endif
        }
       else if ((err = bfd_get_error ()) == bfd_error_wrong_object_format
               || err == bfd_error_file_ambiguously_recognized)
@@ -271,7 +276,7 @@ bfd_check_format_matches (abfd, format, matching)
          abfd->format = bfd_unknown;
 
          if (matching)
-           free ((PTR) matching_vector);
+           free (matching_vector);
 
          return FALSE;
        }
@@ -297,7 +302,9 @@ bfd_check_format_matches (abfd, format, matching)
        }
     }
 
-  if (match_count > 1 && bfd_associated_vector != NULL)
+  if (match_count > 1
+      && bfd_associated_vector != NULL
+      && matching)
     {
       const bfd_target * const *assoc = bfd_associated_vector;
 
@@ -322,7 +329,15 @@ bfd_check_format_matches (abfd, format, matching)
       abfd->xvec = right_targ;         /* Change BFD's target permanently.  */
 
       if (matching)
-       free ((PTR) matching_vector);
+       free (matching_vector);
+
+      /* If the file was opened for update, then `output_has_begun'
+        some time ago when the file was created.  Do not recompute
+        sections sizes or alignments in _bfd_set_section_contents.
+        We can not set this flag until after checking the format,
+        because it will interfere with creation of BFD sections.  */
+      if (abfd->direction == both_direction)
+       abfd->output_has_begun = TRUE;
 
       return TRUE;                     /* File position has moved, BTW.  */
     }
@@ -335,7 +350,7 @@ bfd_check_format_matches (abfd, format, matching)
       bfd_set_error (bfd_error_file_not_recognized);
 
       if (matching)
-       free ((PTR) matching_vector);
+       free (matching_vector);
     }
   else
     {
@@ -373,9 +388,7 @@ DESCRIPTION
 */
 
 bfd_boolean
-bfd_set_format (abfd, format)
-     bfd *abfd;
-     bfd_format format;
+bfd_set_format (bfd *abfd, bfd_format format)
 {
   if (bfd_read_p (abfd)
       || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
@@ -413,17 +426,16 @@ DESCRIPTION
 */
 
 const char *
-bfd_format_string (format)
-     bfd_format format;
+bfd_format_string (bfd_format format)
 {
-  if (((int)format <(int) bfd_unknown)
-      || ((int)format >=(int) bfd_type_end))
+  if (((int) format < (int) bfd_unknown)
+      || ((int) format >= (int) bfd_type_end))
     return "invalid";
 
   switch (format)
     {
     case bfd_object:
-      return "object";         /* Linker/assember/compiler output.  */
+      return "object";         /* Linker/assembler/compiler output.  */
     case bfd_archive:
       return "archive";                /* Object archive file.  */
     case bfd_core:
This page took 0.026125 seconds and 4 git commands to generate.