X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fformat.c;h=4ccca2a3aa789492d7f418a5daf3c5eb5031c97b;hb=0bf60745767d2465c81ee57ae7705a62d6d8fafe;hp=655ccd9f08ff1e9b6fa62883583168d99a42fbe3;hpb=5ed6aba41c826194dcc97807392b22a3cefa1d7e;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/format.c b/bfd/format.c index 655ccd9f08..4ccca2a3aa 100644 --- a/bfd/format.c +++ b/bfd/format.c @@ -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 @@ -86,9 +86,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 +96,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 <>, except when it returns FALSE with @@ -114,10 +112,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 +143,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; } @@ -165,7 +160,7 @@ bfd_check_format_matches (abfd, format, matching) if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) /* rewind! */ { if (matching) - free ((PTR) matching_vector); + free (matching_vector); return FALSE; } @@ -176,7 +171,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. */ } @@ -199,7 +202,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); @@ -220,7 +223,7 @@ bfd_check_format_matches (abfd, format, matching) if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) { if (matching) - free ((PTR) matching_vector); + free (matching_vector); return FALSE; } @@ -250,16 +253,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) @@ -279,7 +272,7 @@ bfd_check_format_matches (abfd, format, matching) abfd->format = bfd_unknown; if (matching) - free ((PTR) matching_vector); + free (matching_vector); return FALSE; } @@ -305,7 +298,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; @@ -330,7 +325,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. */ } @@ -343,7 +346,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 { @@ -381,9 +384,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) @@ -421,17 +422,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: