aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1999-02-03 02:39:33 +0000
committerIan Lance Taylor <ian@airs.com>1999-02-03 02:39:33 +0000
commit6efd50e3f7a639e46eabdf438cea9f7592270516 (patch)
treef98bb6bcfc375789e9030aea67d8bf46742c985b
parent434adc8ec1edc05a931027165b07344b1c6afe57 (diff)
downloadgdb-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/ChangeLog6
-rw-r--r--bfd/format.c77
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;
}