diff options
Diffstat (limited to 'contrib/binutils/bfd/format.c')
-rw-r--r-- | contrib/binutils/bfd/format.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/contrib/binutils/bfd/format.c b/contrib/binutils/bfd/format.c index 9d9ee86..6a34dd2 100644 --- a/contrib/binutils/bfd/format.c +++ b/contrib/binutils/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 @@ -38,6 +38,8 @@ SECTION The BFD contains the result of an executable core dump. +SUBSECTION + File format functions */ #include "bfd.h" @@ -173,6 +175,14 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) if (matching) 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. */ } @@ -207,7 +217,9 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***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. */ @@ -245,16 +257,6 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***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) @@ -329,6 +331,14 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) if (matching) 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. */ } |