Coverage Report

Created: 2023-06-29 07:06

/src/binutils-gdb/bfd/format.c
Line
Count
Source (jump to first uncovered line)
1
/* Generic BFD support for file formats.
2
   Copyright (C) 1990-2023 Free Software Foundation, Inc.
3
   Written by Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
23
/*
24
SECTION
25
  File formats
26
27
  A format is a BFD concept of high level file contents type. The
28
  formats supported by BFD are:
29
30
  o <<bfd_object>>
31
32
  The BFD may contain data, symbols, relocations and debug info.
33
34
  o <<bfd_archive>>
35
36
  The BFD contains other BFDs and an optional index.
37
38
  o <<bfd_core>>
39
40
  The BFD contains the result of an executable core dump.
41
42
SUBSECTION
43
  File format functions
44
*/
45
46
#include "sysdep.h"
47
#include "bfd.h"
48
#include "libbfd.h"
49
50
/* IMPORT from targets.c.  */
51
extern const size_t _bfd_target_vector_entries;
52
53
/*
54
FUNCTION
55
  bfd_check_format
56
57
SYNOPSIS
58
  bool bfd_check_format (bfd *abfd, bfd_format format);
59
60
DESCRIPTION
61
  Verify if the file attached to the BFD @var{abfd} is compatible
62
  with the format @var{format} (i.e., one of <<bfd_object>>,
63
  <<bfd_archive>> or <<bfd_core>>).
64
65
  If the BFD has been set to a specific target before the
66
  call, only the named target and format combination is
67
  checked. If the target has not been set, or has been set to
68
  <<default>>, then all the known target backends is
69
  interrogated to determine a match.  If the default target
70
  matches, it is used.  If not, exactly one target must recognize
71
  the file, or an error results.
72
73
  The function returns <<TRUE>> on success, otherwise <<FALSE>>
74
  with one of the following error codes:
75
76
  o <<bfd_error_invalid_operation>> -
77
  if <<format>> is not one of <<bfd_object>>, <<bfd_archive>> or
78
  <<bfd_core>>.
79
80
  o <<bfd_error_system_call>> -
81
  if an error occured during a read - even some file mismatches
82
  can cause bfd_error_system_calls.
83
84
  o <<file_not_recognised>> -
85
  none of the backends recognised the file format.
86
87
  o <<bfd_error_file_ambiguously_recognized>> -
88
  more than one backend recognised the file format.
89
*/
90
91
bool
92
bfd_check_format (bfd *abfd, bfd_format format)
93
19.5k
{
94
19.5k
  return bfd_check_format_matches (abfd, format, NULL);
95
19.5k
}
96
97
struct bfd_preserve
98
{
99
  void *marker;
100
  void *tdata;
101
  flagword flags;
102
  const struct bfd_iovec *iovec;
103
  void *iostream;
104
  const struct bfd_arch_info *arch_info;
105
  const struct bfd_build_id *build_id;
106
  bfd_cleanup cleanup;
107
  struct bfd_section *sections;
108
  struct bfd_section *section_last;
109
  unsigned int section_count;
110
  unsigned int section_id;
111
  unsigned int symcount;
112
  bool read_only;
113
  bfd_vma start_address;
114
  struct bfd_hash_table section_htab;
115
};
116
117
/* When testing an object for compatibility with a particular target
118
   back-end, the back-end object_p function needs to set up certain
119
   fields in the bfd on successfully recognizing the object.  This
120
   typically happens in a piecemeal fashion, with failures possible at
121
   many points.  On failure, the bfd is supposed to be restored to its
122
   initial state, which is virtually impossible.  However, restoring a
123
   subset of the bfd state works in practice.  This function stores
124
   the subset.  */
125
126
static bool
127
bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve,
128
       bfd_cleanup cleanup)
129
55.6k
{
130
55.6k
  preserve->tdata = abfd->tdata.any;
131
55.6k
  preserve->arch_info = abfd->arch_info;
132
55.6k
  preserve->flags = abfd->flags;
133
55.6k
  preserve->iovec = abfd->iovec;
134
55.6k
  preserve->iostream = abfd->iostream;
135
55.6k
  preserve->sections = abfd->sections;
136
55.6k
  preserve->section_last = abfd->section_last;
137
55.6k
  preserve->section_count = abfd->section_count;
138
55.6k
  preserve->section_id = _bfd_section_id;
139
55.6k
  preserve->symcount = abfd->symcount;
140
55.6k
  preserve->read_only = abfd->read_only;
141
55.6k
  preserve->start_address = abfd->start_address;
142
55.6k
  preserve->section_htab = abfd->section_htab;
143
55.6k
  preserve->marker = bfd_alloc (abfd, 1);
144
55.6k
  preserve->build_id = abfd->build_id;
145
55.6k
  preserve->cleanup = cleanup;
146
55.6k
  if (preserve->marker == NULL)
147
0
    return false;
148
149
55.6k
  return bfd_hash_table_init (&abfd->section_htab, bfd_section_hash_newfunc,
150
55.6k
            sizeof (struct section_hash_entry));
151
55.6k
}
152
153
/* A back-end object_p function may flip a bfd from file backed to
154
   in-memory, eg. pe_ILF_object_p.  In that case to restore the
155
   original IO state we need to reopen the file.  Conversely, if we
156
   are restoring a previously matched pe ILF format and have been
157
   checking further target matches using file IO then we need to close
158
   the file and detach the bfd from the cache lru list.  */
159
160
static void
161
io_reinit (bfd *abfd, struct bfd_preserve *preserve)
162
10.4M
{
163
10.4M
  if (abfd->iovec != preserve->iovec)
164
212
    {
165
      /* Handle file backed to in-memory transition.  bfd_cache_close
166
   won't do anything unless abfd->iovec is the cache_iovec.  */
167
212
      bfd_cache_close (abfd);
168
212
      abfd->iovec = preserve->iovec;
169
212
      abfd->iostream = preserve->iostream;
170
      /* Handle in-memory to file backed transition.  */
171
212
      if ((abfd->flags & BFD_CLOSED_BY_CACHE) != 0
172
212
    && (abfd->flags & BFD_IN_MEMORY) != 0
173
212
    && (preserve->flags & BFD_CLOSED_BY_CACHE) == 0
174
212
    && (preserve->flags & BFD_IN_MEMORY) == 0)
175
75
  bfd_open_file (abfd);
176
212
    }
177
10.4M
  abfd->flags = preserve->flags;
178
10.4M
}
179
180
/* Clear out a subset of BFD state.  */
181
182
static void
183
bfd_reinit (bfd *abfd, unsigned int section_id,
184
      struct bfd_preserve *preserve, bfd_cleanup cleanup)
185
10.4M
{
186
10.4M
  _bfd_section_id = section_id;
187
10.4M
  if (cleanup)
188
8.25k
    cleanup (abfd);
189
10.4M
  abfd->tdata.any = NULL;
190
10.4M
  abfd->arch_info = &bfd_default_arch_struct;
191
10.4M
  io_reinit (abfd, preserve);
192
10.4M
  abfd->symcount = 0;
193
10.4M
  abfd->read_only = 0;
194
10.4M
  abfd->start_address = 0;
195
10.4M
  abfd->build_id = NULL;
196
10.4M
  bfd_section_list_clear (abfd);
197
10.4M
}
198
199
/* Restores bfd state saved by bfd_preserve_save.  */
200
201
static bfd_cleanup
202
bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve)
203
41.9k
{
204
41.9k
  bfd_hash_table_free (&abfd->section_htab);
205
206
41.9k
  abfd->tdata.any = preserve->tdata;
207
41.9k
  abfd->arch_info = preserve->arch_info;
208
41.9k
  io_reinit (abfd, preserve);
209
41.9k
  abfd->section_htab = preserve->section_htab;
210
41.9k
  abfd->sections = preserve->sections;
211
41.9k
  abfd->section_last = preserve->section_last;
212
41.9k
  abfd->section_count = preserve->section_count;
213
41.9k
  _bfd_section_id = preserve->section_id;
214
41.9k
  abfd->symcount = preserve->symcount;
215
41.9k
  abfd->read_only = preserve->read_only;
216
41.9k
  abfd->start_address = preserve->start_address;
217
41.9k
  abfd->build_id = preserve->build_id;
218
219
  /* bfd_release frees all memory more recently bfd_alloc'd than
220
     its arg, as well as its arg.  */
221
41.9k
  bfd_release (abfd, preserve->marker);
222
41.9k
  preserve->marker = NULL;
223
41.9k
  return preserve->cleanup;
224
41.9k
}
225
226
/* Called when the bfd state saved by bfd_preserve_save is no longer
227
   needed.  */
228
229
static void
230
bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve)
231
13.7k
{
232
13.7k
  if (preserve->cleanup)
233
0
    {
234
      /* Run the cleanup, assuming that all it will need is the
235
   tdata at the time the cleanup was returned.  */
236
0
      void *tdata = abfd->tdata.any;
237
0
      abfd->tdata.any = preserve->tdata;
238
0
      preserve->cleanup (abfd);
239
0
      abfd->tdata.any = tdata;
240
0
    }
241
  /* It would be nice to be able to free more memory here, eg. old
242
     tdata, but that's not possible since these blocks are sitting
243
     inside bfd_alloc'd memory.  The section hash is on a separate
244
     objalloc.  */
245
13.7k
  bfd_hash_table_free (&preserve->section_htab);
246
13.7k
  preserve->marker = NULL;
247
13.7k
}
248
249
static void
250
print_warnmsg (struct per_xvec_message **list)
251
6.25k
{
252
6.25k
  fflush (stdout);
253
6.25k
  fprintf (stderr, "%s: ", _bfd_get_error_program_name ());
254
255
24.4k
  for (struct per_xvec_message *warn = *list; warn; warn = warn->next)
256
18.1k
    {
257
18.1k
      fputs (warn->message, stderr);
258
18.1k
      fputc ('\n', stderr);
259
18.1k
    }
260
6.25k
  fflush (stderr);
261
6.25k
}
262
263
static void
264
clear_warnmsg (struct per_xvec_message **list)
265
11.1M
{
266
11.1M
  struct per_xvec_message *warn = *list;
267
11.1M
  while (warn)
268
36.6k
    {
269
36.6k
      struct per_xvec_message *next = warn->next;
270
36.6k
      free (warn);
271
36.6k
      warn = next;
272
36.6k
    }
273
11.1M
  *list = NULL;
274
11.1M
}
275
276
static void
277
null_error_handler (const char *fmt ATTRIBUTE_UNUSED,
278
        va_list ap ATTRIBUTE_UNUSED)
279
0
{
280
0
}
281
282
/*
283
FUNCTION
284
  bfd_check_format_matches
285
286
SYNOPSIS
287
  bool bfd_check_format_matches
288
    (bfd *abfd, bfd_format format, char ***matching);
289
290
DESCRIPTION
291
  Like <<bfd_check_format>>, except when it returns FALSE with
292
  <<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>.  In that
293
  case, if @var{matching} is not NULL, it will be filled in with
294
  a NULL-terminated list of the names of the formats that matched,
295
  allocated with <<malloc>>.
296
  Then the user may choose a format and try again.
297
298
  When done with the list that @var{matching} points to, the caller
299
  should free it.
300
*/
301
302
bool
303
bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
304
44.5k
{
305
44.5k
  extern const bfd_target binary_vec;
306
44.5k
#if BFD_SUPPORTS_PLUGINS
307
44.5k
  extern const bfd_target plugin_vec;
308
44.5k
#endif
309
44.5k
  const bfd_target * const *target;
310
44.5k
  const bfd_target **matching_vector = NULL;
311
44.5k
  const bfd_target *save_targ, *right_targ, *ar_right_targ, *match_targ;
312
44.5k
  int match_count, best_count, best_match;
313
44.5k
  int ar_match_index;
314
44.5k
  unsigned int initial_section_id = _bfd_section_id;
315
44.5k
  struct bfd_preserve preserve, preserve_match;
316
44.5k
  bfd_cleanup cleanup = NULL;
317
44.5k
  bfd_error_handler_type orig_error_handler;
318
44.5k
  static int in_check_format;
319
320
44.5k
  if (matching != NULL)
321
24.9k
    *matching = NULL;
322
323
44.5k
  if (!bfd_read_p (abfd)
324
44.5k
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
325
1.97k
    {
326
1.97k
      bfd_set_error (bfd_error_invalid_operation);
327
1.97k
      return false;
328
1.97k
    }
329
330
42.6k
  if (abfd->format != bfd_unknown)
331
0
    return abfd->format == format;
332
333
42.6k
  if (matching != NULL || *bfd_associated_vector != NULL)
334
42.6k
    {
335
42.6k
      size_t amt;
336
337
42.6k
      amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries;
338
42.6k
      matching_vector = (const bfd_target **) bfd_malloc (amt);
339
42.6k
      if (!matching_vector)
340
0
  return false;
341
42.6k
    }
342
343
  /* Presume the answer is yes.  */
344
42.6k
  abfd->format = format;
345
42.6k
  save_targ = abfd->xvec;
346
347
  /* Don't report errors on recursive calls checking the first element
348
     of an archive.  */
349
42.6k
  if (in_check_format)
350
0
    orig_error_handler = bfd_set_error_handler (null_error_handler);
351
42.6k
  else
352
42.6k
    orig_error_handler = _bfd_set_error_handler_caching (abfd);
353
42.6k
  ++in_check_format;
354
355
42.6k
  preserve_match.marker = NULL;
356
42.6k
  if (!bfd_preserve_save (abfd, &preserve, NULL))
357
0
    goto err_ret;
358
359
  /* If the target type was explicitly specified, just check that target.  */
360
42.6k
  if (!abfd->target_defaulted)
361
42.6k
    {
362
42.6k
      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)  /* rewind! */
363
0
  goto err_ret;
364
365
42.6k
      cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
366
367
42.6k
      if (cleanup)
368
1.29k
  goto ok_ret;
369
370
      /* For a long time the code has dropped through to check all
371
   targets if the specified target was wrong.  I don't know why,
372
   and I'm reluctant to change it.  However, in the case of an
373
   archive, it can cause problems.  If the specified target does
374
   not permit archives (e.g., the binary target), then we should
375
   not allow some other target to recognize it as an archive, but
376
   should instead allow the specified target to recognize it as an
377
   object.  When I first made this change, it broke the PE target,
378
   because the specified pei-i386 target did not recognize the
379
   actual pe-i386 archive.  Since there may be other problems of
380
   this sort, I changed this test to check only for the binary
381
   target.  */
382
41.3k
      if (format == bfd_archive && save_targ == &binary_vec)
383
0
  goto err_unrecog;
384
41.3k
    }
385
386
  /* Since the target type was defaulted, check them all in the hope
387
     that one will be uniquely recognized.  */
388
41.3k
  right_targ = NULL;
389
41.3k
  ar_right_targ = NULL;
390
41.3k
  match_targ = NULL;
391
41.3k
  best_match = 256;
392
41.3k
  best_count = 0;
393
41.3k
  match_count = 0;
394
41.3k
  ar_match_index = _bfd_target_vector_entries;
395
396
10.5M
  for (target = bfd_target_vector; *target != NULL; target++)
397
10.5M
    {
398
10.5M
      void **high_water;
399
400
      /* The binary target matches anything, so don't return it when
401
   searching.  Don't match the plugin target if we have another
402
   alternative since we want to properly set the input format
403
   before allowing a plugin to claim the file.  Also, don't
404
   check the default target twice.  */
405
10.5M
      if (*target == &binary_vec
406
10.5M
#if BFD_SUPPORTS_PLUGINS
407
10.5M
    || (match_count != 0 && *target == &plugin_vec)
408
10.5M
#endif
409
10.5M
    || (!abfd->target_defaulted && *target == save_targ))
410
81.3k
  continue;
411
412
      /* If we already tried a match, the bfd is modified and may
413
   have sections attached, which will confuse the next
414
   _bfd_check_format call.  */
415
10.4M
      bfd_reinit (abfd, initial_section_id, &preserve, cleanup);
416
      /* Free bfd_alloc memory too.  If we have matched and preserved
417
   a target then the high water mark is that much higher.  */
418
10.4M
      if (preserve_match.marker)
419
1.61M
  high_water = &preserve_match.marker;
420
8.82M
      else
421
8.82M
  high_water = &preserve.marker;
422
10.4M
      bfd_release (abfd, *high_water);
423
10.4M
      *high_water = bfd_alloc (abfd, 1);
424
425
      /* Change BFD's target temporarily.  */
426
10.4M
      abfd->xvec = *target;
427
428
10.4M
      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
429
0
  goto err_ret;
430
431
10.4M
      cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
432
10.4M
      if (cleanup)
433
20.3k
  {
434
20.3k
    int match_priority = abfd->xvec->match_priority;
435
20.3k
#if BFD_SUPPORTS_PLUGINS
436
    /* If this object can be handled by a plugin, give that the
437
       lowest priority; objects both handled by a plugin and
438
       with an underlying object format will be claimed
439
       separately by the plugin.  */
440
20.3k
    if (*target == &plugin_vec)
441
0
      match_priority = (*target)->match_priority;
442
20.3k
#endif
443
444
20.3k
    if (abfd->format != bfd_archive
445
20.3k
        || (bfd_has_map (abfd)
446
1.23k
      && bfd_get_error () != bfd_error_wrong_object_format))
447
19.3k
      {
448
        /* If this is the default target, accept it, even if
449
     other targets might match.  People who want those
450
     other targets have to set the GNUTARGET variable.  */
451
19.3k
        if (abfd->xvec == bfd_default_vector[0])
452
687
    goto ok_ret;
453
454
18.6k
        if (matching_vector)
455
18.6k
    matching_vector[match_count] = abfd->xvec;
456
18.6k
        match_count++;
457
458
18.6k
        if (match_priority < best_match)
459
13.7k
    {
460
13.7k
      best_match = match_priority;
461
13.7k
      best_count = 0;
462
13.7k
    }
463
18.6k
        if (match_priority <= best_match)
464
17.7k
    {
465
      /* This format checks out as ok!  */
466
17.7k
      right_targ = abfd->xvec;
467
17.7k
      best_count++;
468
17.7k
    }
469
18.6k
      }
470
994
    else
471
994
      {
472
        /* An archive with no armap or objects of the wrong
473
     type.  We want this target to match if we get no
474
     better matches.  */
475
994
        if (ar_right_targ != bfd_default_vector[0])
476
994
    ar_right_targ = *target;
477
994
        if (matching_vector)
478
994
    matching_vector[ar_match_index] = *target;
479
994
        ar_match_index++;
480
994
      }
481
482
19.6k
    if (preserve_match.marker == NULL)
483
13.0k
      {
484
13.0k
        match_targ = abfd->xvec;
485
13.0k
        if (!bfd_preserve_save (abfd, &preserve_match, cleanup))
486
0
    goto err_ret;
487
13.0k
        cleanup = NULL;
488
13.0k
      }
489
19.6k
  }
490
10.4M
    }
491
492
40.6k
  if (best_count == 1)
493
10.3k
    match_count = 1;
494
495
40.6k
  if (match_count == 0)
496
27.9k
    {
497
      /* Try partial matches.  */
498
27.9k
      right_targ = ar_right_targ;
499
500
27.9k
      if (right_targ == bfd_default_vector[0])
501
0
  {
502
0
    match_count = 1;
503
0
  }
504
27.9k
      else
505
27.9k
  {
506
27.9k
    match_count = ar_match_index - _bfd_target_vector_entries;
507
508
27.9k
    if (matching_vector && match_count > 1)
509
190
      memcpy (matching_vector,
510
190
        matching_vector + _bfd_target_vector_entries,
511
190
        sizeof (*matching_vector) * match_count);
512
27.9k
  }
513
27.9k
    }
514
515
  /* We have more than one equally good match.  If any of the best
516
     matches is a target in config.bfd targ_defvec or targ_selvecs,
517
     choose it.  */
518
40.6k
  if (match_count > 1)
519
2.51k
    {
520
2.51k
      const bfd_target * const *assoc = bfd_associated_vector;
521
522
25.4k
      while ((right_targ = *assoc++) != NULL)
523
23.7k
  {
524
23.7k
    int i = match_count;
525
526
96.0k
    while (--i >= 0)
527
73.0k
      if (matching_vector[i] == right_targ
528
73.0k
    && right_targ->match_priority <= best_match)
529
737
        break;
530
531
23.7k
    if (i >= 0)
532
737
      {
533
737
        match_count = 1;
534
737
        break;
535
737
      }
536
23.7k
  }
537
2.51k
    }
538
539
  /* We still have more than one equally good match, and at least some
540
     of the targets support match priority.  Choose the first of the
541
     best matches.  */
542
40.6k
  if (matching_vector && match_count > 1 && best_count != match_count)
543
424
    {
544
424
      int i;
545
546
637
      for (i = 0; i < match_count; i++)
547
637
  {
548
637
    right_targ = matching_vector[i];
549
637
    if (right_targ->match_priority <= best_match)
550
424
      break;
551
637
  }
552
424
      match_count = 1;
553
424
    }
554
555
  /* There is way too much undoing of half-known state here.  We
556
     really shouldn't iterate on live bfd's.  Note that saving the
557
     whole bfd and restoring it would be even worse; the first thing
558
     you notice is that the cached bfd file position gets out of sync.  */
559
40.6k
  if (preserve_match.marker != NULL)
560
13.0k
    cleanup = bfd_preserve_restore (abfd, &preserve_match);
561
562
40.6k
  if (match_count == 1)
563
11.7k
    {
564
11.7k
      abfd->xvec = right_targ;
565
      /* If we come out of the loop knowing that the last target that
566
   matched is the one we want, then ABFD should still be in a usable
567
   state (except possibly for XVEC).  This is not just an
568
   optimisation.  In the case of plugins a match against the
569
   plugin target can result in the bfd being changed such that
570
   it no longer matches the plugin target, nor will it match
571
   RIGHT_TARG again.  */
572
11.7k
      if (match_targ != right_targ)
573
1.67k
  {
574
1.67k
    bfd_reinit (abfd, initial_section_id, &preserve, cleanup);
575
1.67k
    bfd_release (abfd, preserve.marker);
576
1.67k
    if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
577
0
      goto err_ret;
578
1.67k
    cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
579
1.67k
    BFD_ASSERT (cleanup != NULL);
580
1.67k
  }
581
582
13.7k
    ok_ret:
583
      /* If the file was opened for update, then `output_has_begun'
584
   some time ago when the file was created.  Do not recompute
585
   sections sizes or alignments in _bfd_set_section_contents.
586
   We can not set this flag until after checking the format,
587
   because it will interfere with creation of BFD sections.  */
588
13.7k
      if (abfd->direction == both_direction)
589
0
  abfd->output_has_begun = true;
590
591
13.7k
      free (matching_vector);
592
13.7k
      if (preserve_match.marker != NULL)
593
0
  bfd_preserve_finish (abfd, &preserve_match);
594
13.7k
      bfd_preserve_finish (abfd, &preserve);
595
13.7k
      bfd_set_error_handler (orig_error_handler);
596
597
13.7k
      struct per_xvec_message **list = _bfd_per_xvec_warn (abfd->xvec, 0);
598
13.7k
      if (*list)
599
3.91k
  print_warnmsg (list);
600
13.7k
      list = _bfd_per_xvec_warn (NULL, 0);
601
3.58M
      for (size_t i = 0; i < _bfd_target_vector_entries + 1; i++)
602
3.57M
  clear_warnmsg (list++);
603
13.7k
      --in_check_format;
604
605
      /* File position has moved, BTW.  */
606
13.7k
      return true;
607
11.7k
    }
608
609
28.9k
  if (match_count == 0)
610
27.5k
    {
611
27.5k
    err_unrecog:
612
27.5k
      bfd_set_error (bfd_error_file_not_recognized);
613
27.5k
    err_ret:
614
27.5k
      if (cleanup)
615
0
  cleanup (abfd);
616
27.5k
      abfd->xvec = save_targ;
617
27.5k
      abfd->format = bfd_unknown;
618
27.5k
      free (matching_vector);
619
27.5k
      goto out;
620
27.5k
    }
621
622
  /* Restore original target type and format.  */
623
1.35k
  abfd->xvec = save_targ;
624
1.35k
  abfd->format = bfd_unknown;
625
1.35k
  bfd_set_error (bfd_error_file_ambiguously_recognized);
626
627
1.35k
  if (matching)
628
1.35k
    {
629
1.35k
      *matching = (char **) matching_vector;
630
1.35k
      matching_vector[match_count] = NULL;
631
      /* Return target names.  This is a little nasty.  Maybe we
632
   should do another bfd_malloc?  */
633
5.60k
      while (--match_count >= 0)
634
4.25k
  {
635
4.25k
    const char *name = matching_vector[match_count]->name;
636
4.25k
    *(const char **) &matching_vector[match_count] = name;
637
4.25k
  }
638
1.35k
    }
639
2
  else
640
2
    free (matching_vector);
641
1.35k
  if (cleanup)
642
1.35k
    cleanup (abfd);
643
28.9k
 out:
644
28.9k
  if (preserve_match.marker != NULL)
645
0
    bfd_preserve_finish (abfd, &preserve_match);
646
28.9k
  bfd_preserve_restore (abfd, &preserve);
647
28.9k
  bfd_set_error_handler (orig_error_handler);
648
28.9k
  struct per_xvec_message **list = _bfd_per_xvec_warn (NULL, 0);
649
28.9k
  struct per_xvec_message **one = NULL;
650
7.30M
  for (size_t i = 0; i < _bfd_target_vector_entries + 1; i++)
651
7.27M
    {
652
7.27M
      if (list[i])
653
5.33k
  {
654
5.33k
    if (!one)
655
3.84k
      one = list + i;
656
1.49k
    else
657
1.49k
      {
658
1.49k
        one = NULL;
659
1.49k
        break;
660
1.49k
      }
661
5.33k
  }
662
7.27M
    }
663
28.9k
  if (one)
664
2.34k
    print_warnmsg (one);
665
7.57M
  for (size_t i = 0; i < _bfd_target_vector_entries + 1; i++)
666
7.54M
    clear_warnmsg (list++);
667
28.9k
  --in_check_format;
668
28.9k
  return false;
669
1.35k
}
670
671
/*
672
FUNCTION
673
  bfd_set_format
674
675
SYNOPSIS
676
  bool bfd_set_format (bfd *abfd, bfd_format format);
677
678
DESCRIPTION
679
  This function sets the file format of the BFD @var{abfd} to the
680
  format @var{format}. If the target set in the BFD does not
681
  support the format requested, the format is invalid, or the BFD
682
  is not open for writing, then an error occurs.
683
*/
684
685
bool
686
bfd_set_format (bfd *abfd, bfd_format format)
687
2.01k
{
688
2.01k
  if (bfd_read_p (abfd)
689
2.01k
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
690
0
    {
691
0
      bfd_set_error (bfd_error_invalid_operation);
692
0
      return false;
693
0
    }
694
695
2.01k
  if (abfd->format != bfd_unknown)
696
0
    return abfd->format == format;
697
698
  /* Presume the answer is yes.  */
699
2.01k
  abfd->format = format;
700
701
2.01k
  if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd)))
702
2.01k
    {
703
2.01k
      abfd->format = bfd_unknown;
704
2.01k
      return false;
705
2.01k
    }
706
707
0
  return true;
708
2.01k
}
709
710
/*
711
FUNCTION
712
  bfd_format_string
713
714
SYNOPSIS
715
  const char *bfd_format_string (bfd_format format);
716
717
DESCRIPTION
718
  Return a pointer to a const string
719
  <<invalid>>, <<object>>, <<archive>>, <<core>>, or <<unknown>>,
720
  depending upon the value of @var{format}.
721
*/
722
723
const char *
724
bfd_format_string (bfd_format format)
725
0
{
726
0
  if (((int) format < (int) bfd_unknown)
727
0
      || ((int) format >= (int) bfd_type_end))
728
0
    return "invalid";
729
730
0
  switch (format)
731
0
    {
732
0
    case bfd_object:
733
0
      return "object";   /* Linker/assembler/compiler output.  */
734
0
    case bfd_archive:
735
0
      return "archive";   /* Object archive file.  */
736
0
    case bfd_core:
737
0
      return "core";   /* Core dump.  */
738
0
    default:
739
0
      return "unknown";
740
0
    }
741
0
}