Subversion Repositories Kolibri OS

Rev

Rev 5197 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5197 Rev 6324
1
/* Generic BFD support for file formats.
1
/* Generic BFD support for file formats.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002,
-
 
3
   2003, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
2
   Copyright (C) 1990-2015 Free Software Foundation, Inc.
4
   Written by Cygnus Support.
3
   Written by Cygnus Support.
5
 
4
 
6
   This file is part of BFD, the Binary File Descriptor library.
5
   This file is part of BFD, the Binary File Descriptor library.
7
 
6
 
8
   This program is free software; you can redistribute it and/or modify
7
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
8
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
9
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
10
   (at your option) any later version.
12
 
11
 
13
   This program is distributed in the hope that it will be useful,
12
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
15
   GNU General Public License for more details.
17
 
16
 
18
   You should have received a copy of the GNU General Public License
17
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
18
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
20
   MA 02110-1301, USA.  */
22
 
21
 
23
 
22
 
24
/*
23
/*
25
SECTION
24
SECTION
26
	File formats
25
	File formats
27
 
26
 
28
	A format is a BFD concept of high level file contents type. The
27
	A format is a BFD concept of high level file contents type. The
29
	formats supported by BFD are:
28
	formats supported by BFD are:
30
 
29
 
31
	o <>
30
	o <>
32
 
31
 
33
	The BFD may contain data, symbols, relocations and debug info.
32
	The BFD may contain data, symbols, relocations and debug info.
34
 
33
 
35
	o <>
34
	o <>
36
 
35
 
37
	The BFD contains other BFDs and an optional index.
36
	The BFD contains other BFDs and an optional index.
38
 
37
 
39
	o <>
38
	o <>
40
 
39
 
41
	The BFD contains the result of an executable core dump.
40
	The BFD contains the result of an executable core dump.
42
 
41
 
43
SUBSECTION
42
SUBSECTION
44
	File format functions
43
	File format functions
45
*/
44
*/
46
 
45
 
47
#include "sysdep.h"
46
#include "sysdep.h"
48
#include "bfd.h"
47
#include "bfd.h"
49
#include "libbfd.h"
48
#include "libbfd.h"
50
 
49
 
51
/* IMPORT from targets.c.  */
50
/* IMPORT from targets.c.  */
52
extern const size_t _bfd_target_vector_entries;
51
extern const size_t _bfd_target_vector_entries;
53
 
52
 
54
/*
53
/*
55
FUNCTION
54
FUNCTION
56
	bfd_check_format
55
	bfd_check_format
57
 
56
 
58
SYNOPSIS
57
SYNOPSIS
59
	bfd_boolean bfd_check_format (bfd *abfd, bfd_format format);
58
	bfd_boolean bfd_check_format (bfd *abfd, bfd_format format);
60
 
59
 
61
DESCRIPTION
60
DESCRIPTION
62
	Verify if the file attached to the BFD @var{abfd} is compatible
61
	Verify if the file attached to the BFD @var{abfd} is compatible
63
	with the format @var{format} (i.e., one of <>,
62
	with the format @var{format} (i.e., one of <>,
64
	<> or <>).
63
	<> or <>).
65
 
64
 
66
	If the BFD has been set to a specific target before the
65
	If the BFD has been set to a specific target before the
67
	call, only the named target and format combination is
66
	call, only the named target and format combination is
68
	checked. If the target has not been set, or has been set to
67
	checked. If the target has not been set, or has been set to
69
	<>, then all the known target backends is
68
	<>, then all the known target backends is
70
	interrogated to determine a match.  If the default target
69
	interrogated to determine a match.  If the default target
71
	matches, it is used.  If not, exactly one target must recognize
70
	matches, it is used.  If not, exactly one target must recognize
72
	the file, or an error results.
71
	the file, or an error results.
73
 
72
 
74
	The function returns <> on success, otherwise <>
73
	The function returns <> on success, otherwise <>
75
	with one of the following error codes:
74
	with one of the following error codes:
76
 
75
 
77
	o <> -
76
	o <> -
78
	if <> is not one of <>, <> or
77
	if <> is not one of <>, <> or
79
	<>.
78
	<>.
80
 
79
 
81
	o <> -
80
	o <> -
82
	if an error occured during a read - even some file mismatches
81
	if an error occured during a read - even some file mismatches
83
	can cause bfd_error_system_calls.
82
	can cause bfd_error_system_calls.
84
 
83
 
85
	o <> -
84
	o <> -
86
	none of the backends recognised the file format.
85
	none of the backends recognised the file format.
87
 
86
 
88
	o <> -
87
	o <> -
89
	more than one backend recognised the file format.
88
	more than one backend recognised the file format.
90
*/
89
*/
91
 
90
 
92
bfd_boolean
91
bfd_boolean
93
bfd_check_format (bfd *abfd, bfd_format format)
92
bfd_check_format (bfd *abfd, bfd_format format)
94
{
93
{
95
  return bfd_check_format_matches (abfd, format, NULL);
94
  return bfd_check_format_matches (abfd, format, NULL);
96
}
95
}
97
 
96
 
98
struct bfd_preserve
97
struct bfd_preserve
99
{
98
{
100
  void *marker;
99
  void *marker;
101
  void *tdata;
100
  void *tdata;
102
  flagword flags;
101
  flagword flags;
103
  const struct bfd_arch_info *arch_info;
102
  const struct bfd_arch_info *arch_info;
104
  struct bfd_section *sections;
103
  struct bfd_section *sections;
105
  struct bfd_section *section_last;
104
  struct bfd_section *section_last;
106
  unsigned int section_count;
105
  unsigned int section_count;
107
  struct bfd_hash_table section_htab;
106
  struct bfd_hash_table section_htab;
108
};
107
};
109
 
108
 
110
/* When testing an object for compatibility with a particular target
109
/* When testing an object for compatibility with a particular target
111
   back-end, the back-end object_p function needs to set up certain
110
   back-end, the back-end object_p function needs to set up certain
112
   fields in the bfd on successfully recognizing the object.  This
111
   fields in the bfd on successfully recognizing the object.  This
113
   typically happens in a piecemeal fashion, with failures possible at
112
   typically happens in a piecemeal fashion, with failures possible at
114
   many points.  On failure, the bfd is supposed to be restored to its
113
   many points.  On failure, the bfd is supposed to be restored to its
115
   initial state, which is virtually impossible.  However, restoring a
114
   initial state, which is virtually impossible.  However, restoring a
116
   subset of the bfd state works in practice.  This function stores
115
   subset of the bfd state works in practice.  This function stores
117
   the subset.  */
116
   the subset.  */
118
 
117
 
119
static bfd_boolean
118
static bfd_boolean
120
bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve)
119
bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve)
121
{
120
{
122
  preserve->tdata = abfd->tdata.any;
121
  preserve->tdata = abfd->tdata.any;
123
  preserve->arch_info = abfd->arch_info;
122
  preserve->arch_info = abfd->arch_info;
124
  preserve->flags = abfd->flags;
123
  preserve->flags = abfd->flags;
125
  preserve->sections = abfd->sections;
124
  preserve->sections = abfd->sections;
126
  preserve->section_last = abfd->section_last;
125
  preserve->section_last = abfd->section_last;
127
  preserve->section_count = abfd->section_count;
126
  preserve->section_count = abfd->section_count;
128
  preserve->section_htab = abfd->section_htab;
127
  preserve->section_htab = abfd->section_htab;
129
  preserve->marker = bfd_alloc (abfd, 1);
128
  preserve->marker = bfd_alloc (abfd, 1);
130
  if (preserve->marker == NULL)
129
  if (preserve->marker == NULL)
131
    return FALSE;
130
    return FALSE;
132
 
131
 
133
  return bfd_hash_table_init (&abfd->section_htab, bfd_section_hash_newfunc,
132
  return bfd_hash_table_init (&abfd->section_htab, bfd_section_hash_newfunc,
134
			      sizeof (struct section_hash_entry));
133
			      sizeof (struct section_hash_entry));
135
}
134
}
136
 
135
 
137
/* Clear out a subset of BFD state.  */
136
/* Clear out a subset of BFD state.  */
138
 
137
 
139
static void
138
static void
140
bfd_reinit (bfd *abfd)
139
bfd_reinit (bfd *abfd)
141
{
140
{
142
  abfd->tdata.any = NULL;
141
  abfd->tdata.any = NULL;
143
  abfd->arch_info = &bfd_default_arch_struct;
142
  abfd->arch_info = &bfd_default_arch_struct;
144
  abfd->flags &= BFD_FLAGS_SAVED;
143
  abfd->flags &= BFD_FLAGS_SAVED;
145
  bfd_section_list_clear (abfd);
144
  bfd_section_list_clear (abfd);
146
}
145
}
147
 
146
 
148
/* Restores bfd state saved by bfd_preserve_save.  */
147
/* Restores bfd state saved by bfd_preserve_save.  */
149
 
148
 
150
static void
149
static void
151
bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve)
150
bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve)
152
{
151
{
153
  bfd_hash_table_free (&abfd->section_htab);
152
  bfd_hash_table_free (&abfd->section_htab);
154
 
153
 
155
  abfd->tdata.any = preserve->tdata;
154
  abfd->tdata.any = preserve->tdata;
156
  abfd->arch_info = preserve->arch_info;
155
  abfd->arch_info = preserve->arch_info;
157
  abfd->flags = preserve->flags;
156
  abfd->flags = preserve->flags;
158
  abfd->section_htab = preserve->section_htab;
157
  abfd->section_htab = preserve->section_htab;
159
  abfd->sections = preserve->sections;
158
  abfd->sections = preserve->sections;
160
  abfd->section_last = preserve->section_last;
159
  abfd->section_last = preserve->section_last;
161
  abfd->section_count = preserve->section_count;
160
  abfd->section_count = preserve->section_count;
162
 
161
 
163
  /* bfd_release frees all memory more recently bfd_alloc'd than
162
  /* bfd_release frees all memory more recently bfd_alloc'd than
164
     its arg, as well as its arg.  */
163
     its arg, as well as its arg.  */
165
  bfd_release (abfd, preserve->marker);
164
  bfd_release (abfd, preserve->marker);
166
  preserve->marker = NULL;
165
  preserve->marker = NULL;
167
}
166
}
168
 
167
 
169
/* Called when the bfd state saved by bfd_preserve_save is no longer
168
/* Called when the bfd state saved by bfd_preserve_save is no longer
170
   needed.  */
169
   needed.  */
171
 
170
 
172
static void
171
static void
173
bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve)
172
bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve)
174
{
173
{
175
  /* It would be nice to be able to free more memory here, eg. old
174
  /* It would be nice to be able to free more memory here, eg. old
176
     tdata, but that's not possible since these blocks are sitting
175
     tdata, but that's not possible since these blocks are sitting
177
     inside bfd_alloc'd memory.  The section hash is on a separate
176
     inside bfd_alloc'd memory.  The section hash is on a separate
178
     objalloc.  */
177
     objalloc.  */
179
  bfd_hash_table_free (&preserve->section_htab);
178
  bfd_hash_table_free (&preserve->section_htab);
180
  preserve->marker = NULL;
179
  preserve->marker = NULL;
181
}
180
}
182
 
181
 
183
/*
182
/*
184
FUNCTION
183
FUNCTION
185
	bfd_check_format_matches
184
	bfd_check_format_matches
186
 
185
 
187
SYNOPSIS
186
SYNOPSIS
188
	bfd_boolean bfd_check_format_matches
187
	bfd_boolean bfd_check_format_matches
189
	  (bfd *abfd, bfd_format format, char ***matching);
188
	  (bfd *abfd, bfd_format format, char ***matching);
190
 
189
 
191
DESCRIPTION
190
DESCRIPTION
192
	Like <>, except when it returns FALSE with
191
	Like <>, except when it returns FALSE with
193
	<> set to <>.  In that
192
	<> set to <>.  In that
194
	case, if @var{matching} is not NULL, it will be filled in with
193
	case, if @var{matching} is not NULL, it will be filled in with
195
	a NULL-terminated list of the names of the formats that matched,
194
	a NULL-terminated list of the names of the formats that matched,
196
	allocated with <>.
195
	allocated with <>.
197
	Then the user may choose a format and try again.
196
	Then the user may choose a format and try again.
198
 
197
 
199
	When done with the list that @var{matching} points to, the caller
198
	When done with the list that @var{matching} points to, the caller
200
	should free it.
199
	should free it.
201
*/
200
*/
202
 
201
 
203
bfd_boolean
202
bfd_boolean
204
bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
203
bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
205
{
204
{
206
  extern const bfd_target binary_vec;
205
  extern const bfd_target binary_vec;
207
  const bfd_target * const *target;
206
  const bfd_target * const *target;
208
  const bfd_target **matching_vector = NULL;
207
  const bfd_target **matching_vector = NULL;
209
  const bfd_target *save_targ, *right_targ, *ar_right_targ, *match_targ;
208
  const bfd_target *save_targ, *right_targ, *ar_right_targ, *match_targ;
210
  int match_count, best_count, best_match;
209
  int match_count, best_count, best_match;
211
  int ar_match_index;
210
  int ar_match_index;
212
  struct bfd_preserve preserve;
211
  struct bfd_preserve preserve;
213
 
212
 
214
  if (matching != NULL)
213
  if (matching != NULL)
215
    *matching = NULL;
214
    *matching = NULL;
216
 
215
 
217
  if (!bfd_read_p (abfd)
216
  if (!bfd_read_p (abfd)
218
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
217
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
219
    {
218
    {
220
      bfd_set_error (bfd_error_invalid_operation);
219
      bfd_set_error (bfd_error_invalid_operation);
221
      return FALSE;
220
      return FALSE;
222
    }
221
    }
223
 
222
 
224
  if (abfd->format != bfd_unknown)
223
  if (abfd->format != bfd_unknown)
225
    return abfd->format == format;
224
    return abfd->format == format;
226
 
225
 
227
  if (matching != NULL || *bfd_associated_vector != NULL)
226
  if (matching != NULL || *bfd_associated_vector != NULL)
228
    {
227
    {
229
      bfd_size_type amt;
228
      bfd_size_type amt;
230
 
229
 
231
      amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries;
230
      amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries;
232
      matching_vector = (const bfd_target **) bfd_malloc (amt);
231
      matching_vector = (const bfd_target **) bfd_malloc (amt);
233
      if (!matching_vector)
232
      if (!matching_vector)
234
	return FALSE;
233
	return FALSE;
235
    }
234
    }
236
 
235
 
237
  /* Presume the answer is yes.  */
236
  /* Presume the answer is yes.  */
238
  abfd->format = format;
237
  abfd->format = format;
239
  save_targ = abfd->xvec;
238
  save_targ = abfd->xvec;
240
  preserve.marker = NULL;
239
  preserve.marker = NULL;
241
 
240
 
242
  /* If the target type was explicitly specified, just check that target.  */
241
  /* If the target type was explicitly specified, just check that target.  */
243
  if (!abfd->target_defaulted)
242
  if (!abfd->target_defaulted)
244
    {
243
    {
245
      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)	/* rewind! */
244
      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)	/* rewind! */
246
	goto err_ret;
245
	goto err_ret;
247
 
246
 
248
      right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
247
      right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
249
 
248
 
250
      if (right_targ)
249
      if (right_targ)
251
	goto ok_ret;
250
	goto ok_ret;
252
 
251
 
253
      /* For a long time the code has dropped through to check all
252
      /* For a long time the code has dropped through to check all
254
	 targets if the specified target was wrong.  I don't know why,
253
	 targets if the specified target was wrong.  I don't know why,
255
	 and I'm reluctant to change it.  However, in the case of an
254
	 and I'm reluctant to change it.  However, in the case of an
256
	 archive, it can cause problems.  If the specified target does
255
	 archive, it can cause problems.  If the specified target does
257
	 not permit archives (e.g., the binary target), then we should
256
	 not permit archives (e.g., the binary target), then we should
258
	 not allow some other target to recognize it as an archive, but
257
	 not allow some other target to recognize it as an archive, but
259
	 should instead allow the specified target to recognize it as an
258
	 should instead allow the specified target to recognize it as an
260
	 object.  When I first made this change, it broke the PE target,
259
	 object.  When I first made this change, it broke the PE target,
261
	 because the specified pei-i386 target did not recognize the
260
	 because the specified pei-i386 target did not recognize the
262
	 actual pe-i386 archive.  Since there may be other problems of
261
	 actual pe-i386 archive.  Since there may be other problems of
263
	 this sort, I changed this test to check only for the binary
262
	 this sort, I changed this test to check only for the binary
264
	 target.  */
263
	 target.  */
265
      if (format == bfd_archive && save_targ == &binary_vec)
264
      if (format == bfd_archive && save_targ == &binary_vec)
266
	goto err_unrecog;
265
	goto err_unrecog;
267
    }
266
    }
268
 
267
 
269
  /* Since the target type was defaulted, check them all in the hope
268
  /* Since the target type was defaulted, check them all in the hope
270
     that one will be uniquely recognized.  */
269
     that one will be uniquely recognized.  */
271
  right_targ = NULL;
270
  right_targ = NULL;
272
  ar_right_targ = NULL;
271
  ar_right_targ = NULL;
273
  match_targ = NULL;
272
  match_targ = NULL;
274
  best_match = 256;
273
  best_match = 256;
275
  best_count = 0;
274
  best_count = 0;
276
  match_count = 0;
275
  match_count = 0;
277
  ar_match_index = _bfd_target_vector_entries;
276
  ar_match_index = _bfd_target_vector_entries;
278
 
277
 
279
  for (target = bfd_target_vector; *target != NULL; target++)
278
  for (target = bfd_target_vector; *target != NULL; target++)
280
    {
279
    {
281
      const bfd_target *temp;
280
      const bfd_target *temp;
282
 
281
 
283
      /* Don't check the default target twice.  */
282
      /* Don't check the default target twice.  */
284
      if (*target == &binary_vec
283
      if (*target == &binary_vec
285
	  || (!abfd->target_defaulted && *target == save_targ)
284
	  || (!abfd->target_defaulted && *target == save_targ)
286
	  || (*target)->match_priority > best_match)
285
	  || (*target)->match_priority > best_match)
287
	continue;
286
	continue;
288
 
287
 
289
      /* If we already tried a match, the bfd is modified and may
288
      /* If we already tried a match, the bfd is modified and may
290
	 have sections attached, which will confuse the next
289
	 have sections attached, which will confuse the next
291
	 _bfd_check_format call.  */
290
	 _bfd_check_format call.  */
292
      bfd_reinit (abfd);
291
      bfd_reinit (abfd);
293
 
292
 
294
      /* Change BFD's target temporarily.  */
293
      /* Change BFD's target temporarily.  */
295
      abfd->xvec = *target;
294
      abfd->xvec = *target;
296
 
295
 
297
      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
296
      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
298
	goto err_ret;
297
	goto err_ret;
299
 
298
 
300
      /* If _bfd_check_format neglects to set bfd_error, assume
299
      /* If _bfd_check_format neglects to set bfd_error, assume
301
	 bfd_error_wrong_format.  We didn't used to even pay any
300
	 bfd_error_wrong_format.  We didn't used to even pay any
302
	 attention to bfd_error, so I suspect that some
301
	 attention to bfd_error, so I suspect that some
303
	 _bfd_check_format might have this problem.  */
302
	 _bfd_check_format might have this problem.  */
304
      bfd_set_error (bfd_error_wrong_format);
303
      bfd_set_error (bfd_error_wrong_format);
305
 
304
 
306
      temp = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
305
      temp = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
307
      if (temp)
306
      if (temp)
308
	{
307
	{
309
	  match_targ = temp;
308
	  match_targ = temp;
310
	  if (preserve.marker != NULL)
309
	  if (preserve.marker != NULL)
311
	    bfd_preserve_finish (abfd, &preserve);
310
	    bfd_preserve_finish (abfd, &preserve);
312
 
311
 
313
	  if (abfd->format != bfd_archive
312
	  if (abfd->format != bfd_archive
314
	      || (bfd_has_map (abfd)
313
	      || (bfd_has_map (abfd)
315
		  && bfd_get_error () != bfd_error_wrong_object_format))
314
		  && bfd_get_error () != bfd_error_wrong_object_format))
316
	    {
315
	    {
317
	      /* This format checks out as ok!  */
316
	      /* This format checks out as ok!  */
318
	      right_targ = temp;
317
	      right_targ = temp;
319
 
318
 
320
	      /* If this is the default target, accept it, even if
319
	      /* If this is the default target, accept it, even if
321
		 other targets might match.  People who want those
320
		 other targets might match.  People who want those
322
		 other targets have to set the GNUTARGET variable.  */
321
		 other targets have to set the GNUTARGET variable.  */
323
	      if (temp == bfd_default_vector[0])
322
	      if (temp == bfd_default_vector[0])
324
		goto ok_ret;
323
		goto ok_ret;
325
 
324
 
326
	      if (matching_vector)
325
	      if (matching_vector)
327
		matching_vector[match_count] = temp;
326
		matching_vector[match_count] = temp;
328
	      match_count++;
327
	      match_count++;
329
 
328
 
330
	      if (temp->match_priority < best_match)
329
	      if (temp->match_priority < best_match)
331
		{
330
		{
332
		  best_match = temp->match_priority;
331
		  best_match = temp->match_priority;
333
		  best_count = 0;
332
		  best_count = 0;
334
		}
333
		}
335
	      best_count++;
334
	      best_count++;
336
	    }
335
	    }
337
	  else
336
	  else
338
	    {
337
	    {
339
	      /* An archive with no armap or objects of the wrong
338
	      /* An archive with no armap or objects of the wrong
340
		 type.  We want this target to match if we get no
339
		 type.  We want this target to match if we get no
341
		 better matches.  */
340
		 better matches.  */
342
	      if (ar_right_targ != bfd_default_vector[0])
341
	      if (ar_right_targ != bfd_default_vector[0])
343
		ar_right_targ = *target;
342
		ar_right_targ = *target;
344
	      if (matching_vector)
343
	      if (matching_vector)
345
		matching_vector[ar_match_index] = *target;
344
		matching_vector[ar_match_index] = *target;
346
	      ar_match_index++;
345
	      ar_match_index++;
347
	    }
346
	    }
348
 
347
 
349
	  if (!bfd_preserve_save (abfd, &preserve))
348
	  if (!bfd_preserve_save (abfd, &preserve))
350
	    goto err_ret;
349
	    goto err_ret;
351
	}
350
	}
352
      else if (bfd_get_error () != bfd_error_wrong_format)
351
      else if (bfd_get_error () != bfd_error_wrong_format)
353
	goto err_ret;
352
	goto err_ret;
354
    }
353
    }
355
 
354
 
356
  if (best_count == 1)
355
  if (best_count == 1)
357
    match_count = 1;
356
    match_count = 1;
358
 
357
 
359
  if (match_count == 0)
358
  if (match_count == 0)
360
    {
359
    {
361
      /* Try partial matches.  */
360
      /* Try partial matches.  */
362
      right_targ = ar_right_targ;
361
      right_targ = ar_right_targ;
363
 
362
 
364
      if (right_targ == bfd_default_vector[0])
363
      if (right_targ == bfd_default_vector[0])
365
	{
364
	{
366
	  match_count = 1;
365
	  match_count = 1;
367
	}
366
	}
368
      else
367
      else
369
	{
368
	{
370
	  match_count = ar_match_index - _bfd_target_vector_entries;
369
	  match_count = ar_match_index - _bfd_target_vector_entries;
371
 
370
 
372
	  if (matching_vector && match_count > 1)
371
	  if (matching_vector && match_count > 1)
373
	    memcpy (matching_vector,
372
	    memcpy (matching_vector,
374
		    matching_vector + _bfd_target_vector_entries,
373
		    matching_vector + _bfd_target_vector_entries,
375
		    sizeof (*matching_vector) * match_count);
374
		    sizeof (*matching_vector) * match_count);
376
	}
375
	}
377
    }
376
    }
378
 
377
 
379
  /* We have more than one equally good match.  If any of the best
378
  /* We have more than one equally good match.  If any of the best
380
     matches is a target in config.bfd targ_defvec or targ_selvecs,
379
     matches is a target in config.bfd targ_defvec or targ_selvecs,
381
     choose it.  */
380
     choose it.  */
382
  if (match_count > 1)
381
  if (match_count > 1)
383
    {
382
    {
384
      const bfd_target * const *assoc = bfd_associated_vector;
383
      const bfd_target * const *assoc = bfd_associated_vector;
385
 
384
 
386
      while ((right_targ = *assoc++) != NULL)
385
      while ((right_targ = *assoc++) != NULL)
387
	{
386
	{
388
	  int i = match_count;
387
	  int i = match_count;
389
 
388
 
390
	  while (--i >= 0)
389
	  while (--i >= 0)
391
	    if (matching_vector[i] == right_targ
390
	    if (matching_vector[i] == right_targ
392
		&& right_targ->match_priority <= best_match)
391
		&& right_targ->match_priority <= best_match)
393
	      break;
392
	      break;
394
 
393
 
395
	  if (i >= 0)
394
	  if (i >= 0)
396
	    {
395
	    {
397
	      match_count = 1;
396
	      match_count = 1;
398
	      break;
397
	      break;
399
	    }
398
	    }
400
	}
399
	}
401
    }
400
    }
402
 
401
 
403
  /* We still have more than one equally good match, and at least some
402
  /* We still have more than one equally good match, and at least some
404
     of the targets support match priority.  Choose the first of the
403
     of the targets support match priority.  Choose the first of the
405
     best matches.  */
404
     best matches.  */
406
  if (match_count > 1 && best_count != match_count)
405
  if (matching_vector && match_count > 1 && best_count != match_count)
407
    {
406
    {
408
      int i;
407
      int i;
409
 
408
 
410
      for (i = 0; i < match_count; i++)
409
      for (i = 0; i < match_count; i++)
411
	{
410
	{
412
	  right_targ = matching_vector[i];
411
	  right_targ = matching_vector[i];
413
	  if (right_targ->match_priority <= best_match)
412
	  if (right_targ->match_priority <= best_match)
414
	    break;
413
	    break;
415
	}
414
	}
416
      match_count = 1;
415
      match_count = 1;
417
    }
416
    }
418
 
417
 
419
  /* There is way too much undoing of half-known state here.  We
418
  /* There is way too much undoing of half-known state here.  We
420
     really shouldn't iterate on live bfd's.  Note that saving the
419
     really shouldn't iterate on live bfd's.  Note that saving the
421
     whole bfd and restoring it would be even worse; the first thing
420
     whole bfd and restoring it would be even worse; the first thing
422
     you notice is that the cached bfd file position gets out of sync.  */
421
     you notice is that the cached bfd file position gets out of sync.  */
423
  if (preserve.marker != NULL)
422
  if (preserve.marker != NULL)
424
    bfd_preserve_restore (abfd, &preserve);
423
    bfd_preserve_restore (abfd, &preserve);
425
 
424
 
426
  if (match_count == 1)
425
  if (match_count == 1)
427
    {
426
    {
428
      abfd->xvec = right_targ;
427
      abfd->xvec = right_targ;
429
      /* If we come out of the loop knowing that the last target that
428
      /* If we come out of the loop knowing that the last target that
430
	 matched is the one we want, then ABFD should still be in a usable
429
	 matched is the one we want, then ABFD should still be in a usable
431
	 state (except possibly for XVEC).  */
430
	 state (except possibly for XVEC).  */
432
      if (match_targ != right_targ)
431
      if (match_targ != right_targ)
433
	{
432
	{
434
	  bfd_reinit (abfd);
433
	  bfd_reinit (abfd);
435
	  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
434
	  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
436
	    goto err_ret;
435
	    goto err_ret;
437
	  match_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
436
	  match_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
438
	  BFD_ASSERT (match_targ != NULL);
437
	  BFD_ASSERT (match_targ != NULL);
439
	}
438
	}
440
 
439
 
441
    ok_ret:
440
    ok_ret:
442
      /* If the file was opened for update, then `output_has_begun'
441
      /* If the file was opened for update, then `output_has_begun'
443
	 some time ago when the file was created.  Do not recompute
442
	 some time ago when the file was created.  Do not recompute
444
	 sections sizes or alignments in _bfd_set_section_contents.
443
	 sections sizes or alignments in _bfd_set_section_contents.
445
	 We can not set this flag until after checking the format,
444
	 We can not set this flag until after checking the format,
446
	 because it will interfere with creation of BFD sections.  */
445
	 because it will interfere with creation of BFD sections.  */
447
      if (abfd->direction == both_direction)
446
      if (abfd->direction == both_direction)
448
	abfd->output_has_begun = TRUE;
447
	abfd->output_has_begun = TRUE;
449
 
448
 
450
      if (matching_vector)
449
      if (matching_vector)
451
	free (matching_vector);
450
	free (matching_vector);
452
 
451
 
453
      /* File position has moved, BTW.  */
452
      /* File position has moved, BTW.  */
454
      return TRUE;
453
      return TRUE;
455
    }
454
    }
456
 
455
 
457
  if (match_count == 0)
456
  if (match_count == 0)
458
    {
457
    {
459
    err_unrecog:
458
    err_unrecog:
460
      bfd_set_error (bfd_error_file_not_recognized);
459
      bfd_set_error (bfd_error_file_not_recognized);
461
    err_ret:
460
    err_ret:
462
      abfd->xvec = save_targ;
461
      abfd->xvec = save_targ;
463
      abfd->format = bfd_unknown;
462
      abfd->format = bfd_unknown;
464
      if (matching_vector)
463
      if (matching_vector)
465
	free (matching_vector);
464
	free (matching_vector);
466
      if (preserve.marker != NULL)
465
      if (preserve.marker != NULL)
467
	bfd_preserve_restore (abfd, &preserve);
466
	bfd_preserve_restore (abfd, &preserve);
468
      return FALSE;
467
      return FALSE;
469
    }
468
    }
470
 
469
 
471
  /* Restore original target type and format.  */
470
  /* Restore original target type and format.  */
472
  abfd->xvec = save_targ;
471
  abfd->xvec = save_targ;
473
  abfd->format = bfd_unknown;
472
  abfd->format = bfd_unknown;
474
  bfd_set_error (bfd_error_file_ambiguously_recognized);
473
  bfd_set_error (bfd_error_file_ambiguously_recognized);
475
 
474
 
476
  if (matching)
475
  if (matching)
477
    {
476
    {
478
      *matching = (char **) matching_vector;
477
      *matching = (char **) matching_vector;
479
      matching_vector[match_count] = NULL;
478
      matching_vector[match_count] = NULL;
480
      /* Return target names.  This is a little nasty.  Maybe we
479
      /* Return target names.  This is a little nasty.  Maybe we
481
	 should do another bfd_malloc?  */
480
	 should do another bfd_malloc?  */
482
      while (--match_count >= 0)
481
      while (--match_count >= 0)
483
	{
482
	{
484
	  const char *name = matching_vector[match_count]->name;
483
	  const char *name = matching_vector[match_count]->name;
485
	  *(const char **) &matching_vector[match_count] = name;
484
	  *(const char **) &matching_vector[match_count] = name;
486
	}
485
	}
487
    }
486
    }
488
  return FALSE;
487
  return FALSE;
489
}
488
}
490
 
489
 
491
/*
490
/*
492
FUNCTION
491
FUNCTION
493
	bfd_set_format
492
	bfd_set_format
494
 
493
 
495
SYNOPSIS
494
SYNOPSIS
496
	bfd_boolean bfd_set_format (bfd *abfd, bfd_format format);
495
	bfd_boolean bfd_set_format (bfd *abfd, bfd_format format);
497
 
496
 
498
DESCRIPTION
497
DESCRIPTION
499
	This function sets the file format of the BFD @var{abfd} to the
498
	This function sets the file format of the BFD @var{abfd} to the
500
	format @var{format}. If the target set in the BFD does not
499
	format @var{format}. If the target set in the BFD does not
501
	support the format requested, the format is invalid, or the BFD
500
	support the format requested, the format is invalid, or the BFD
502
	is not open for writing, then an error occurs.
501
	is not open for writing, then an error occurs.
503
*/
502
*/
504
 
503
 
505
bfd_boolean
504
bfd_boolean
506
bfd_set_format (bfd *abfd, bfd_format format)
505
bfd_set_format (bfd *abfd, bfd_format format)
507
{
506
{
508
  if (bfd_read_p (abfd)
507
  if (bfd_read_p (abfd)
509
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
508
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
510
    {
509
    {
511
      bfd_set_error (bfd_error_invalid_operation);
510
      bfd_set_error (bfd_error_invalid_operation);
512
      return FALSE;
511
      return FALSE;
513
    }
512
    }
514
 
513
 
515
  if (abfd->format != bfd_unknown)
514
  if (abfd->format != bfd_unknown)
516
    return abfd->format == format;
515
    return abfd->format == format;
517
 
516
 
518
  /* Presume the answer is yes.  */
517
  /* Presume the answer is yes.  */
519
  abfd->format = format;
518
  abfd->format = format;
520
 
519
 
521
  if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd)))
520
  if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd)))
522
    {
521
    {
523
      abfd->format = bfd_unknown;
522
      abfd->format = bfd_unknown;
524
      return FALSE;
523
      return FALSE;
525
    }
524
    }
526
 
525
 
527
  return TRUE;
526
  return TRUE;
528
}
527
}
529
 
528
 
530
/*
529
/*
531
FUNCTION
530
FUNCTION
532
	bfd_format_string
531
	bfd_format_string
533
 
532
 
534
SYNOPSIS
533
SYNOPSIS
535
	const char *bfd_format_string (bfd_format format);
534
	const char *bfd_format_string (bfd_format format);
536
 
535
 
537
DESCRIPTION
536
DESCRIPTION
538
	Return a pointer to a const string
537
	Return a pointer to a const string
539
	<>, <>, <>, <>, or <>,
538
	<>, <>, <>, <>, or <>,
540
	depending upon the value of @var{format}.
539
	depending upon the value of @var{format}.
541
*/
540
*/
542
 
541
 
543
const char *
542
const char *
544
bfd_format_string (bfd_format format)
543
bfd_format_string (bfd_format format)
545
{
544
{
546
  if (((int) format < (int) bfd_unknown)
545
  if (((int) format < (int) bfd_unknown)
547
      || ((int) format >= (int) bfd_type_end))
546
      || ((int) format >= (int) bfd_type_end))
548
    return "invalid";
547
    return "invalid";
549
 
548
 
550
  switch (format)
549
  switch (format)
551
    {
550
    {
552
    case bfd_object:
551
    case bfd_object:
553
      return "object";		/* Linker/assembler/compiler output.  */
552
      return "object";		/* Linker/assembler/compiler output.  */
554
    case bfd_archive:
553
    case bfd_archive:
555
      return "archive";		/* Object archive file.  */
554
      return "archive";		/* Object archive file.  */
556
    case bfd_core:
555
    case bfd_core:
557
      return "core";		/* Core dump.  */
556
      return "core";		/* Core dump.  */
558
    default:
557
    default:
559
      return "unknown";
558
      return "unknown";
560
    }
559
    }
561
}
560
}