diff options
author | Ian Lance Taylor <ian@airs.com> | 1999-02-03 02:39:33 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1999-02-03 02:39:33 +0000 |
commit | 6efd50e3f7a639e46eabdf438cea9f7592270516 (patch) | |
tree | f98bb6bcfc375789e9030aea67d8bf46742c985b | |
parent | 434adc8ec1edc05a931027165b07344b1c6afe57 (diff) | |
download | gdb-6efd50e3f7a639e46eabdf438cea9f7592270516.zip gdb-6efd50e3f7a639e46eabdf438cea9f7592270516.tar.gz gdb-6efd50e3f7a639e46eabdf438cea9f7592270516.tar.bz2 |
* format.c (bfd_check_format_matches): If the target was
previously specified, don't check other targets when checking for
an archive file.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/format.c | 77 |
2 files changed, 58 insertions, 25 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 540e669..123fc92 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +Tue Feb 2 21:38:28 1999 Ian Lance Taylor <ian@cygnus.com> + + * format.c (bfd_check_format_matches): If the target was + previously specified, don't check other targets when checking for + an archive file. + Tue Feb 2 18:16:43 1999 Catherine Moore <clm@cygnus.com> * elf32-arm.h (elf32_arm_reloc_map): Removed. diff --git a/bfd/format.c b/bfd/format.c index fb9fdc0..a07935a 100644 --- a/bfd/format.c +++ b/bfd/format.c @@ -1,5 +1,5 @@ /* Generic BFD support for file formats. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. + Copyright (C) 1990, 91, 92, 93, 94, 95, 1999 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -16,7 +16,7 @@ GNU General Public License for more details. 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* SECTION @@ -45,7 +45,7 @@ SECTION #include "libbfd.h" /* IMPORT from targets.c. */ -extern CONST size_t _bfd_target_vector_entries; +extern const size_t _bfd_target_vector_entries; /* FUNCTION @@ -70,18 +70,18 @@ DESCRIPTION The function returns <<true>> on success, otherwise <<false>> with one of the following error codes: - o <<invalid_operation>> - + o <<bfd_error_invalid_operation>> - if <<format>> is not one of <<bfd_object>>, <<bfd_archive>> or <<bfd_core>>. - o <<system_call_error>> - + o <<bfd_error_system_call>> - if an error occured during a read - even some file mismatches - can cause system_call_errors. + can cause bfd_error_system_calls. o <<file_not_recognised>> - none of the backends recognised the file format. - o <<file_ambiguously_recognized>> - + o <<bfd_error_file_ambiguously_recognized>> - more than one backend recognised the file format. */ @@ -102,7 +102,7 @@ SYNOPSIS DESCRIPTION Like <<bfd_check_format>>, except when it returns false with - <<bfd_errno>> set to <<file_ambiguously_recognized>>. In that + <<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>. In that case, if @var{matching} is not NULL, it will be filled in with a NULL-terminated list of the names of the formats that matched, allocated with <<malloc>>. @@ -118,14 +118,14 @@ bfd_check_format_matches (abfd, format, matching) bfd_format format; char ***matching; { - bfd_target **target, *save_targ, *right_targ; - char **matching_vector; + const bfd_target * const *target, *save_targ, *right_targ; + char **matching_vector = NULL; int match_count; if (!bfd_read_p (abfd) || ((int)(abfd->format) < (int)bfd_unknown) || ((int)(abfd->format) >= (int)bfd_type_end)) { - bfd_error = invalid_operation; + bfd_set_error (bfd_error_invalid_operation); return false; } @@ -140,10 +140,13 @@ bfd_check_format_matches (abfd, format, matching) match_count = 0; if (matching) { - *matching = matching_vector = - (char **) bfd_xmalloc_by_size_t (sizeof (char *) * - (_bfd_target_vector_entries + 1)); + matching_vector = + (char **) bfd_malloc (sizeof (char *) * + (_bfd_target_vector_entries + 1)); + if (!matching_vector) + return false; matching_vector[0] = NULL; + *matching = matching_vector; } right_targ = 0; @@ -154,8 +157,8 @@ bfd_check_format_matches (abfd, format, matching) /* If the target type was explicitly specified, just check that target. */ if (!abfd->target_defaulted) { - bfd_seek (abfd, (file_ptr)0, SEEK_SET); /* rewind! */ - + if (bfd_seek (abfd, (file_ptr)0, SEEK_SET) != 0) /* rewind! */ + return false; right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); if (right_targ) { abfd->xvec = right_targ; /* Set the target as returned */ @@ -163,17 +166,41 @@ bfd_check_format_matches (abfd, format, matching) free (matching_vector); return true; /* File position has moved, BTW */ } + + /* For a long time the code has dropped through to check all + targets if the specified target was wrong. I don't know why, + and I'm reluctant to change it. However, in the case of an + archive, it can cause problems. If the specified target does + not permit archives (e.g., the binary target), then we should + not allow some other target to recognize it as an archive, but + should instead allow the specified target to recognize it as an + object. */ + + if (format == bfd_archive) + { + abfd->xvec = save_targ; + abfd->format = bfd_unknown; + if (matching) + free (matching_vector); + bfd_set_error (bfd_error_file_not_recognized); + return false; + } } for (target = bfd_target_vector; *target != NULL; target++) { - bfd_target *temp; + extern const bfd_target binary_vec; + const bfd_target *temp; + + if (*target == &binary_vec) + continue; abfd->xvec = *target; /* Change BFD's target temporarily */ - bfd_seek (abfd, (file_ptr)0, SEEK_SET); - /* If _bfd_check_format neglects to set bfd_error, assume wrong_format. + if (bfd_seek (abfd, (file_ptr)0, SEEK_SET) != 0) + return false; + /* If _bfd_check_format neglects to set bfd_error, assume bfd_error_wrong_format. We didn't used to even pay any attention to bfd_error, so I suspect that some _bfd_check_format might have this problem. */ - bfd_error = wrong_format; + bfd_set_error (bfd_error_wrong_format); temp = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); if (temp) { /* This format checks out as ok! */ right_targ = temp; @@ -205,10 +232,10 @@ bfd_check_format_matches (abfd, format, matching) */ break; #endif - } else if (bfd_error != wrong_format) { + } else if (bfd_get_error () != bfd_error_wrong_format) { abfd->xvec = save_targ; abfd->format = bfd_unknown; - if (matching && bfd_error != file_ambiguously_recognized) + if (matching && bfd_get_error () != bfd_error_file_ambiguously_recognized) free (matching_vector); return false; } @@ -225,12 +252,12 @@ bfd_check_format_matches (abfd, format, matching) abfd->format = bfd_unknown; /* Restore original format */ if (match_count == 0) { - bfd_error = file_not_recognized; + bfd_set_error (bfd_error_file_not_recognized); if (matching) free (matching_vector); } else - bfd_error = file_ambiguously_recognized; + bfd_set_error (bfd_error_file_ambiguously_recognized); return false; } @@ -258,7 +285,7 @@ bfd_set_format (abfd, format) if (bfd_read_p (abfd) || ((int)abfd->format < (int)bfd_unknown) || ((int)abfd->format >= (int)bfd_type_end)) { - bfd_error = invalid_operation; + bfd_set_error (bfd_error_invalid_operation); return false; } |