Coverage Report

Created: 2026-04-04 08:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/format.c
Line
Count
Source
1
/* Generic BFD support for file formats.
2
   Copyright (C) 1990-2026 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
#include "plugin.h"
50
#include "elf-bfd.h"
51
52
/* IMPORT from targets.c.  */
53
extern const size_t _bfd_target_vector_entries;
54
55
/*
56
FUNCTION
57
  bfd_check_format
58
59
SYNOPSIS
60
  bool bfd_check_format (bfd *abfd, bfd_format format);
61
62
DESCRIPTION
63
  Verify if the file attached to the BFD @var{abfd} is compatible
64
  with the format @var{format} (i.e., one of <<bfd_object>>,
65
  <<bfd_archive>> or <<bfd_core>>).
66
67
  If the BFD has been set to a specific target before the
68
  call, only the named target and format combination is
69
  checked. If the target has not been set, or has been set to
70
  <<default>>, then all the known target backends is
71
  interrogated to determine a match.  If the default target
72
  matches, it is used.  If not, exactly one target must recognize
73
  the file, or an error results.
74
75
  The function returns <<TRUE>> on success, otherwise <<FALSE>>
76
  with one of the following error codes:
77
78
  o <<bfd_error_invalid_operation>> -
79
  if <<format>> is not one of <<bfd_object>>, <<bfd_archive>> or
80
  <<bfd_core>>.
81
82
  o <<bfd_error_system_call>> -
83
  if an error occured during a read - even some file mismatches
84
  can cause bfd_error_system_calls.
85
86
  o <<file_not_recognised>> -
87
  none of the backends recognised the file format.
88
89
  o <<bfd_error_file_ambiguously_recognized>> -
90
  more than one backend recognised the file format.
91
92
  When calling bfd_check_format (or bfd_check_format_matches),
93
  any underlying file descriptor will be kept open for the
94
  duration of the call.  This is done to avoid races when
95
  another thread calls bfd_cache_close_all.  In this scenario,
96
  the thread calling bfd_check_format must call bfd_cache_close
97
  itself.
98
*/
99
100
bool
101
bfd_check_format (bfd *abfd, bfd_format format)
102
8.74M
{
103
8.74M
  return bfd_check_format_matches (abfd, format, NULL);
104
8.74M
}
105
106
struct bfd_preserve
107
{
108
  void *marker;
109
  void *tdata;
110
  flagword flags;
111
  const struct bfd_iovec *iovec;
112
  void *iostream;
113
  const struct bfd_arch_info *arch_info;
114
  const struct bfd_build_id *build_id;
115
  bfd_cleanup cleanup;
116
  struct bfd_section *sections;
117
  struct bfd_section *section_last;
118
  unsigned int section_count;
119
  unsigned int section_id;
120
  unsigned int symcount;
121
  bool read_only;
122
  bfd_vma start_address;
123
  struct bfd_hash_table section_htab;
124
};
125
126
/* When testing an object for compatibility with a particular target
127
   back-end, the back-end object_p function needs to set up certain
128
   fields in the bfd on successfully recognizing the object.  This
129
   typically happens in a piecemeal fashion, with failures possible at
130
   many points.  On failure, the bfd is supposed to be restored to its
131
   initial state, which is virtually impossible.  However, restoring a
132
   subset of the bfd state works in practice.  This function stores
133
   the subset.  */
134
135
static bool
136
bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve,
137
       bfd_cleanup cleanup)
138
8.89M
{
139
8.89M
  preserve->tdata = abfd->tdata.any;
140
8.89M
  preserve->arch_info = abfd->arch_info;
141
8.89M
  preserve->flags = abfd->flags;
142
8.89M
  preserve->iovec = abfd->iovec;
143
8.89M
  preserve->iostream = abfd->iostream;
144
8.89M
  preserve->sections = abfd->sections;
145
8.89M
  preserve->section_last = abfd->section_last;
146
8.89M
  preserve->section_count = abfd->section_count;
147
8.89M
  preserve->section_id = _bfd_section_id;
148
8.89M
  preserve->symcount = abfd->symcount;
149
8.89M
  preserve->read_only = abfd->read_only;
150
8.89M
  preserve->start_address = abfd->start_address;
151
8.89M
  preserve->section_htab = abfd->section_htab;
152
8.89M
  preserve->marker = bfd_alloc (abfd, 1);
153
8.89M
  preserve->build_id = abfd->build_id;
154
8.89M
  preserve->cleanup = cleanup;
155
8.89M
  if (preserve->marker == NULL)
156
0
    return false;
157
158
8.89M
  return bfd_hash_table_init (&abfd->section_htab, bfd_section_hash_newfunc,
159
8.89M
            sizeof (struct section_hash_entry));
160
8.89M
}
161
162
/* A back-end object_p function may flip a bfd from file backed to
163
   in-memory, eg. pe_ILF_object_p.  In that case to restore the
164
   original IO state we need to reopen the file.  Conversely, if we
165
   are restoring a previously matched pe ILF format and have been
166
   checking further target matches using file IO then we need to close
167
   the file and detach the bfd from the cache lru list.  */
168
169
static void
170
io_reinit (bfd *abfd, struct bfd_preserve *preserve)
171
52.0M
{
172
52.0M
  if (abfd->iovec != preserve->iovec)
173
22
    {
174
      /* Handle file backed to in-memory transition.  bfd_cache_close
175
   won't do anything unless abfd->iovec is the cache_iovec.
176
   Don't be tempted to call iovec->bclose here.  We don't want
177
   to call memory_bclose, which would free the bim.  The bim
178
   must be kept if bfd_check_format_matches is going to decide
179
   later that the PE format needing it is in fact the correct
180
   target match.  */
181
22
      bfd_cache_close (abfd);
182
22
      abfd->iovec = preserve->iovec;
183
22
      abfd->iostream = preserve->iostream;
184
185
      /* Handle in-memory to file backed transition.  */
186
22
      if ((abfd->flags & BFD_CLOSED_BY_CACHE) != 0
187
22
    && (abfd->flags & BFD_IN_MEMORY) != 0
188
12
    && (preserve->flags & BFD_CLOSED_BY_CACHE) == 0
189
12
    && (preserve->flags & BFD_IN_MEMORY) == 0)
190
12
  bfd_open_file (abfd);
191
22
    }
192
52.0M
  abfd->flags = preserve->flags;
193
52.0M
}
194
195
/* Clear out a subset of BFD state.  */
196
197
static void
198
bfd_reinit (bfd *abfd, unsigned int section_id,
199
      struct bfd_preserve *preserve, bfd_cleanup cleanup)
200
43.2M
{
201
43.2M
  _bfd_section_id = section_id;
202
43.2M
  if (cleanup)
203
8.63M
    cleanup (abfd);
204
43.2M
  abfd->tdata.any = NULL;
205
43.2M
  abfd->arch_info = &bfd_default_arch_struct;
206
43.2M
  io_reinit (abfd, preserve);
207
43.2M
  abfd->symcount = 0;
208
43.2M
  abfd->read_only = 0;
209
43.2M
  abfd->start_address = 0;
210
43.2M
  abfd->build_id = NULL;
211
43.2M
  bfd_section_list_clear (abfd);
212
43.2M
}
213
214
/* Restores bfd state saved by bfd_preserve_save.  */
215
216
static bfd_cleanup
217
bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve)
218
8.75M
{
219
8.75M
  bfd_hash_table_free (&abfd->section_htab);
220
221
8.75M
  abfd->tdata.any = preserve->tdata;
222
8.75M
  abfd->arch_info = preserve->arch_info;
223
8.75M
  io_reinit (abfd, preserve);
224
8.75M
  abfd->section_htab = preserve->section_htab;
225
8.75M
  abfd->sections = preserve->sections;
226
8.75M
  abfd->section_last = preserve->section_last;
227
8.75M
  abfd->section_count = preserve->section_count;
228
8.75M
  _bfd_section_id = preserve->section_id;
229
8.75M
  abfd->symcount = preserve->symcount;
230
8.75M
  abfd->read_only = preserve->read_only;
231
8.75M
  abfd->start_address = preserve->start_address;
232
8.75M
  abfd->build_id = preserve->build_id;
233
234
  /* bfd_release frees all memory more recently bfd_alloc'd than
235
     its arg, as well as its arg.  */
236
8.75M
  bfd_release (abfd, preserve->marker);
237
8.75M
  preserve->marker = NULL;
238
8.75M
  return preserve->cleanup;
239
8.75M
}
240
241
/* Called when the bfd state saved by bfd_preserve_save is no longer
242
   needed.  */
243
244
static void
245
bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve)
246
135k
{
247
135k
  if (preserve->cleanup)
248
0
    {
249
      /* Run the cleanup, assuming that all it will need is the
250
   tdata at the time the cleanup was returned.  */
251
0
      void *tdata = abfd->tdata.any;
252
0
      abfd->tdata.any = preserve->tdata;
253
0
      preserve->cleanup (abfd);
254
0
      abfd->tdata.any = tdata;
255
0
    }
256
  /* It would be nice to be able to free more memory here, eg. old
257
     tdata, but that's not possible since these blocks are sitting
258
     inside bfd_alloc'd memory.  The section hash is on a separate
259
     objalloc.  */
260
135k
  bfd_hash_table_free (&preserve->section_htab);
261
135k
  preserve->marker = NULL;
262
135k
}
263
264
static void
265
print_warnmsg (struct per_xvec_message **list)
266
8.69M
{
267
8.81M
  for (struct per_xvec_message *warn = *list; warn; warn = warn->next)
268
125k
    _bfd_error_handler ("%s", warn->message);
269
8.69M
}
270
271
static void
272
clear_warnmsg (struct per_xvec_message **list)
273
8.82M
{
274
8.82M
  struct per_xvec_message *warn = *list;
275
9.03M
  while (warn)
276
202k
    {
277
202k
      struct per_xvec_message *next = warn->next;
278
202k
      free (warn);
279
202k
      warn = next;
280
202k
    }
281
8.82M
  *list = NULL;
282
8.82M
}
283
284
/* Free all the storage in LIST.  Note that the first element of LIST
285
   is special and is assumed to be stack-allocated.  TARG is used for
286
   re-issuing warning messages.  If TARG is PER_XVEC_NO_TARGET, then
287
   it acts like a sort of wildcard -- messages are reissued if all
288
   targets with messages have identical messages.  One copy of the
289
   messages are then reissued.  If TARG is anything else, then only
290
   messages associated with TARG are emitted.  */
291
292
static void
293
print_and_clear_messages (struct per_xvec_messages *list,
294
        const bfd_target *targ)
295
8.80M
{
296
8.80M
  struct per_xvec_messages *iter;
297
298
8.80M
  if (targ == PER_XVEC_NO_TARGET)
299
8.66M
    {
300
8.66M
      iter = list->next;
301
8.67M
      while (iter != NULL)
302
8.54k
  {
303
8.54k
    struct per_xvec_message *msg1 = list->messages;
304
8.54k
    struct per_xvec_message *msg2 = iter->messages;
305
8.54k
    do
306
19.3k
      {
307
19.3k
        if (strcmp (msg1->message, msg2->message))
308
1.08k
    break;
309
18.2k
        msg1 = msg1->next;
310
18.2k
        msg2 = msg2->next;
311
18.2k
      } while (msg1 && msg2);
312
8.54k
    if (msg1 || msg2)
313
1.34k
      break;
314
7.20k
    iter = iter->next;
315
7.20k
  }
316
8.66M
      if (iter == NULL)
317
8.66M
  targ = list->targ;
318
8.66M
    }
319
320
8.80M
  iter = list;
321
17.6M
  while (iter != NULL)
322
8.82M
    {
323
8.82M
      struct per_xvec_messages *next = iter->next;
324
325
8.82M
      if (iter->targ == targ)
326
8.69M
  print_warnmsg (&iter->messages);
327
8.82M
      clear_warnmsg (&iter->messages);
328
8.82M
      if (iter != list)
329
28.7k
  free (iter);
330
8.82M
      iter = next;
331
8.82M
    }
332
333
  /* Don't retain a pointer to free'd memory.  */
334
8.80M
  list->next = NULL;
335
8.80M
}
336
337
/* Discard all messages associated with TARG in LIST.  Unlike
338
   print_and_clear_messages, PER_XVEC_NO_TARGET is not valid for TARG.  */
339
340
static void
341
clear_messages (struct per_xvec_messages *list,
342
    const bfd_target *targ)
343
43.1M
{
344
43.1M
  struct per_xvec_messages *iter;
345
346
90.0M
  for (iter = list; iter != NULL; iter = iter->next)
347
46.8M
    {
348
46.8M
      if (iter->targ == targ)
349
30
  clear_warnmsg (&iter->messages);
350
46.8M
    }
351
43.1M
}
352
353
/* This a copy of lto_section defined in GCC (lto-streamer.h).  */
354
355
struct lto_section
356
{
357
  int16_t major_version;
358
  int16_t minor_version;
359
  unsigned char slim_object;
360
361
  /* Flags is a private field that is not defined publicly.  */
362
  uint16_t flags;
363
};
364
365
/* Set lto_type in ABFD.  */
366
367
static void
368
bfd_set_lto_type (bfd *abfd)
369
135k
{
370
135k
  if (abfd->format == bfd_object
371
91.5k
      && abfd->lto_type == lto_non_object
372
91.5k
      && (abfd->flags
373
91.5k
    & (DYNAMIC
374
91.5k
       | (bfd_get_flavour (abfd) == bfd_target_elf_flavour
375
91.5k
    ? EXEC_P : 0))) == 0)
376
86.0k
    {
377
86.0k
      asection *sec = abfd->sections;
378
86.0k
      enum bfd_lto_object_type type = lto_non_ir_object;
379
86.0k
      if (sec == NULL)
380
7.18k
  {
381
    /* If there are no sections, check for slim LLVM IR object whose
382
       first 4 bytes are: 'B', 'C', 0xc0, 0xde.  */
383
7.18k
    bfd_byte llvm_ir_magic[4];
384
7.18k
    if (bfd_seek (abfd, 0, SEEK_SET) == 0
385
7.18k
        && bfd_read (llvm_ir_magic, 4, abfd) == 4
386
7.18k
        && llvm_ir_magic[0] == 'B'
387
4
        && llvm_ir_magic[1] == 'C'
388
0
        && llvm_ir_magic[2] == 0xc0
389
0
        && llvm_ir_magic[3] == 0xde)
390
0
      type = lto_slim_ir_object;
391
7.18k
  }
392
78.8k
      else
393
78.8k
  {
394
78.8k
    struct lto_section lsection = { 0, 0, 0, 0 };
395
    /* GCC uses .gnu.lto_.lto.<some_hash> as a LTO bytecode
396
       information section.  */
397
1.61M
    for (; sec != NULL; sec = sec->next)
398
1.53M
      if (strcmp (sec->name, GNU_OBJECT_ONLY_SECTION_NAME) == 0)
399
30
        {
400
30
    type = lto_mixed_object;
401
30
    abfd->object_only_section = sec;
402
30
    break;
403
30
        }
404
1.53M
      else if (strcmp (sec->name, ".llvm.lto") == 0)
405
40
        {
406
40
    type = lto_fat_ir_object;
407
40
    break;
408
40
        }
409
1.53M
      else if (lsection.major_version == 0
410
1.53M
         && startswith (sec->name, ".gnu.lto_.lto.")
411
405
         && bfd_get_section_contents (abfd, sec, &lsection, 0,
412
405
              sizeof (struct lto_section)))
413
223
        {
414
223
    if (lsection.slim_object)
415
115
      type = lto_slim_ir_object;
416
108
    else
417
108
      type = lto_fat_ir_object;
418
223
    }
419
78.8k
  }
420
421
86.0k
      abfd->lto_type = type;
422
86.0k
    }
423
135k
}
424
425
/*
426
FUNCTION
427
  bfd_check_format_matches
428
429
SYNOPSIS
430
  bool bfd_check_format_matches
431
    (bfd *abfd, bfd_format format, char ***matching);
432
433
DESCRIPTION
434
  Like <<bfd_check_format>>, except when it returns FALSE with
435
  <<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>.
436
  In that case, if @var{matching} is not NULL, it will be filled
437
  in with a NULL-terminated list of the names of the formats
438
  that matched, allocated with <<malloc>>.
439
  Then the user may choose a format and try again.
440
441
  When done with the list that @var{matching} points to, the caller
442
  should free it.
443
*/
444
445
bool
446
bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
447
8.80M
{
448
8.80M
  extern const bfd_target binary_vec;
449
8.80M
  const bfd_target * const *target;
450
8.80M
  const bfd_target **matching_vector;
451
8.80M
  const bfd_target *save_targ, *right_targ, *ar_right_targ, *match_targ;
452
8.80M
  const bfd_target *fail_targ;
453
8.80M
  int match_count, best_count, best_match;
454
8.80M
  int ar_match_index;
455
8.80M
  unsigned int initial_section_id;
456
8.80M
  struct bfd_preserve preserve, preserve_match;
457
8.80M
  bfd_cleanup cleanup = NULL;
458
8.80M
  struct per_xvec_messages messages = { abfd, PER_XVEC_NO_TARGET, NULL, NULL };
459
8.80M
  struct per_xvec_messages *orig_messages;
460
8.80M
  bool old_in_format_matches;
461
462
8.80M
  if (matching != NULL)
463
60.8k
    *matching = NULL;
464
465
8.80M
  if (!bfd_read_p (abfd)
466
8.80M
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
467
4.50k
    {
468
4.50k
      bfd_set_error (bfd_error_invalid_operation);
469
4.50k
      return false;
470
4.50k
    }
471
472
8.80M
  if (abfd->format != bfd_unknown)
473
42
    return abfd->format == format;
474
475
8.80M
  matching_vector = bfd_malloc (sizeof (*matching_vector)
476
8.80M
        * 2 * _bfd_target_vector_entries);
477
8.80M
  if (!matching_vector)
478
0
    return false;
479
480
  /* Avoid clashes with bfd_cache_close_all running in another
481
     thread.  */
482
8.80M
  if (!bfd_cache_set_uncloseable (abfd, true, &old_in_format_matches))
483
0
    {
484
0
      free (matching_vector);
485
0
      return false;
486
0
    }
487
488
  /* Locking is required here in order to manage _bfd_section_id.  */
489
8.80M
  if (!bfd_lock ())
490
0
    {
491
0
      bfd_cache_set_uncloseable (abfd, old_in_format_matches, NULL);
492
0
      free (matching_vector);
493
0
      return false;
494
0
    }
495
8.80M
  initial_section_id = _bfd_section_id;
496
497
  /* Presume the answer is yes.  */
498
8.80M
  abfd->format = format;
499
8.80M
  save_targ = abfd->xvec;
500
501
  /* Don't report errors on recursive calls checking the first element
502
     of an archive.  */
503
8.80M
  orig_messages = _bfd_set_error_handler_caching (&messages);
504
505
8.80M
  preserve_match.marker = NULL;
506
8.80M
  if (!bfd_preserve_save (abfd, &preserve, NULL))
507
0
    goto err_ret;
508
509
  /* First try matching the plugin target if appropriate.  Next try
510
     the current target.  The current target may have been set due to
511
     a user option, or due to the linker trying optimistically to load
512
     input files for the same target as the output.  Either will
513
     have target_defaulted false.  Failing that, bfd_find_target will
514
     have chosen a default target, and target_defaulted will be true.  */
515
8.80M
  fail_targ = NULL;
516
8.80M
  if (bfd_plugin_enabled ()
517
8.80M
      && abfd->format == bfd_object
518
8.70M
      && abfd->target_defaulted
519
75.8k
      && !abfd->is_linker_input
520
75.8k
      && abfd->plugin_format != bfd_plugin_no)
521
72.5k
    {
522
72.5k
      if (bfd_seek (abfd, 0, SEEK_SET) != 0)
523
0
  goto err_ret;
524
525
72.5k
      BFD_ASSERT (save_targ != bfd_plugin_vec ());
526
72.5k
      abfd->xvec = bfd_plugin_vec ();
527
72.5k
      bfd_set_error (bfd_error_no_error);
528
72.5k
      cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
529
72.5k
      if (cleanup)
530
0
  goto ok_ret;
531
532
72.5k
      bfd_reinit (abfd, initial_section_id, &preserve, cleanup);
533
72.5k
      bfd_release (abfd, preserve.marker);
534
72.5k
      preserve.marker = bfd_alloc (abfd, 1);
535
72.5k
      abfd->xvec = save_targ;
536
72.5k
    }
537
538
  /* bfd_plugin_no excluding the plugin target is an optimisation.
539
     The test can be removed if desired.  */
540
8.80M
  if (!(abfd->plugin_format == bfd_plugin_no
541
7.10k
  && bfd_plugin_target_p (save_targ)))
542
8.80M
    {
543
8.80M
      if (bfd_seek (abfd, 0, SEEK_SET) != 0)
544
0
  goto err_ret;
545
546
8.80M
      bfd_set_error (bfd_error_no_error);
547
8.80M
      cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
548
8.80M
      if (cleanup)
549
91.2k
  {
550
91.2k
    if (abfd->format != bfd_archive
551
        /* An archive with object files matching the archive
552
     target is OK.  Other archives should be further
553
     tested.  */
554
39.5k
        || bfd_get_error () != bfd_error_wrong_object_format)
555
53.2k
      goto ok_ret;
556
91.2k
  }
557
8.70M
      else
558
8.70M
  {
559
8.70M
    if (!abfd->target_defaulted && !abfd->is_linker_input)
560
8.57M
      goto err_unrecog;
561
130k
    fail_targ = save_targ;
562
130k
  }
563
8.80M
    }
564
565
  /* Check all targets in the hope that one will be recognized.  */
566
168k
  right_targ = NULL;
567
168k
  ar_right_targ = NULL;
568
168k
  match_targ = NULL;
569
168k
  best_match = 256;
570
168k
  best_count = 0;
571
168k
  match_count = 0;
572
168k
  ar_match_index = _bfd_target_vector_entries;
573
574
43.7M
  for (target = bfd_target_vector; *target != NULL; target++)
575
43.5M
    {
576
43.5M
      void **high_water;
577
578
      /* The binary target matches anything, so don't return it when
579
   searching.  Also, don't check the current target twice when
580
   it has failed already.
581
   Don't match the plugin target during linking if we have
582
   another alternative since we want to properly set the input
583
   format before allowing a plugin to claim the file.
584
   Also as an optimisation don't match the plugin target when
585
   abfd->plugin_format is set to bfd_plugin_no.  (This occurs
586
   when LTO sections have been stripped or when we have a
587
   recursive call here from the plugin object_p via
588
   bfd_plugin_get_symbols_in_object_only.)  */
589
43.5M
      if (*target == &binary_vec
590
43.4M
    || *target == fail_targ
591
43.1M
    || (((abfd->is_linker_input && match_count != 0)
592
43.1M
         || abfd->plugin_format == bfd_plugin_no)
593
1.72M
        && bfd_plugin_target_p (*target)))
594
435k
  continue;
595
596
      /* If we already tried a match, the bfd is modified and may
597
   have sections attached, which will confuse the next
598
   _bfd_check_format call.  */
599
43.1M
      bfd_reinit (abfd, initial_section_id, &preserve, cleanup);
600
      /* Free bfd_alloc memory too.  If we have matched and preserved
601
   a target then the high water mark is that much higher.  */
602
43.1M
      if (preserve_match.marker)
603
18.8M
  high_water = &preserve_match.marker;
604
24.3M
      else
605
24.3M
  high_water = &preserve.marker;
606
43.1M
      bfd_release (abfd, *high_water);
607
43.1M
      *high_water = bfd_alloc (abfd, 1);
608
609
      /* Change BFD's target temporarily.  */
610
43.1M
      abfd->xvec = *target;
611
612
      /* It is possible that targets appear multiple times in
613
   bfd_target_vector.  If this is the case, then we want to avoid
614
   accumulating duplicate messages for a target in MESSAGES, so
615
   discard any previous messages associated with this target.  */
616
43.1M
      clear_messages (&messages, abfd->xvec);
617
618
43.1M
      if (bfd_seek (abfd, 0, SEEK_SET) != 0)
619
0
  goto err_ret;
620
621
43.1M
      bfd_set_error (bfd_error_no_error);
622
43.1M
      cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
623
43.1M
      if (cleanup)
624
8.66M
  {
625
8.66M
    if (abfd->format != bfd_archive
626
8.58M
        || bfd_get_error () != bfd_error_wrong_object_format)
627
124k
      {
628
        /* If this is the default target, accept it, even if
629
     other targets might match.  People who want those
630
     other targets have to set the GNUTARGET variable.  */
631
124k
        if (abfd->xvec == bfd_default_vector[0])
632
0
    goto ok_ret;
633
634
124k
        matching_vector[match_count] = abfd->xvec;
635
124k
        match_count++;
636
637
124k
        int match_priority = abfd->xvec->match_priority;
638
124k
        if (match_priority == 1
639
22.9k
      && bfd_get_flavour (abfd) == bfd_target_elf_flavour)
640
21.3k
    {
641
      /* If the object e_ident matches the hint elf_osabi,
642
         bump priority up.  */
643
21.3k
      Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
644
21.3k
      elf_backend_data *bed = get_elf_backend_data (abfd);
645
21.3k
      if (bed->elf_osabi != ELFOSABI_NONE
646
966
          && i_ehdrp->e_ident[EI_OSABI] == bed->elf_osabi)
647
1
        match_priority = 0;
648
21.3k
    }
649
124k
        if (match_priority < best_match)
650
85.6k
    {
651
85.6k
      best_match = match_priority;
652
85.6k
      best_count = 0;
653
85.6k
    }
654
124k
        if (match_priority <= best_match)
655
117k
    {
656
      /* This format checks out as ok!  */
657
117k
      right_targ = abfd->xvec;
658
117k
      best_count++;
659
117k
    }
660
124k
      }
661
8.53M
    else
662
8.53M
      {
663
        /* An archive with no armap or objects of the wrong
664
     type.  We want this target to match if we get no
665
     better matches.  */
666
8.53M
        if (ar_right_targ != bfd_default_vector[0])
667
73.2k
    ar_right_targ = *target;
668
8.53M
        matching_vector[ar_match_index] = *target;
669
8.53M
        ar_match_index++;
670
8.53M
      }
671
672
8.66M
    if (preserve_match.marker == NULL)
673
93.5k
      {
674
93.5k
        match_targ = abfd->xvec;
675
93.5k
        if (!bfd_preserve_save (abfd, &preserve_match, cleanup))
676
0
    goto err_ret;
677
93.5k
        cleanup = NULL;
678
93.5k
      }
679
8.66M
  }
680
43.1M
    }
681
682
168k
  if (best_count == 1)
683
52.8k
    match_count = 1;
684
685
168k
  if (match_count == 0)
686
95.6k
    {
687
      /* Try partial matches.  */
688
95.6k
      right_targ = ar_right_targ;
689
690
95.6k
      if (right_targ == bfd_default_vector[0])
691
18.8k
  {
692
18.8k
    match_count = 1;
693
18.8k
  }
694
76.8k
      else
695
76.8k
  {
696
76.8k
    match_count = ar_match_index - _bfd_target_vector_entries;
697
698
76.8k
    if (match_count > 1)
699
1.26k
      memcpy (matching_vector,
700
1.26k
        matching_vector + _bfd_target_vector_entries,
701
1.26k
        sizeof (*matching_vector) * match_count);
702
76.8k
  }
703
95.6k
    }
704
705
  /* We have more than one equally good match.  If any of the best
706
     matches is a target in config.bfd targ_defvec or targ_selvecs,
707
     choose it.  */
708
168k
  if (match_count > 1)
709
21.7k
    {
710
21.7k
      const bfd_target * const *assoc = bfd_associated_vector;
711
712
204k
      while ((right_targ = *assoc++) != NULL)
713
188k
  {
714
188k
    int i = match_count;
715
716
867k
    while (--i >= 0)
717
684k
      if (matching_vector[i] == right_targ
718
8.96k
    && right_targ->match_priority <= best_match)
719
5.68k
        break;
720
721
188k
    if (i >= 0)
722
5.68k
      {
723
5.68k
        match_count = 1;
724
5.68k
        break;
725
5.68k
      }
726
188k
  }
727
21.7k
    }
728
729
  /* We still have more than one equally good match, and at least some
730
     of the targets support match priority.  Choose the first of the
731
     best matches.  */
732
168k
  if (match_count > 1 && best_count != match_count)
733
4.36k
    {
734
4.36k
      int i;
735
736
7.28k
      for (i = 0; i < match_count; i++)
737
7.28k
  {
738
7.28k
    right_targ = matching_vector[i];
739
7.28k
    if (right_targ->match_priority <= best_match)
740
4.36k
      break;
741
7.28k
  }
742
4.36k
      match_count = 1;
743
4.36k
    }
744
745
  /* There is way too much undoing of half-known state here.  We
746
     really shouldn't iterate on live bfd's.  Note that saving the
747
     whole bfd and restoring it would be even worse; the first thing
748
     you notice is that the cached bfd file position gets out of sync.  */
749
168k
  if (preserve_match.marker != NULL)
750
93.5k
    cleanup = bfd_preserve_restore (abfd, &preserve_match);
751
752
168k
  if (match_count == 1)
753
81.8k
    {
754
81.8k
      abfd->xvec = right_targ;
755
      /* If we come out of the loop knowing that the last target that
756
   matched is the one we want, then ABFD should still be in a usable
757
   state (except possibly for XVEC).  This is not just an
758
   optimisation.  In the case of plugins a match against the
759
   plugin target can result in the bfd being changed such that
760
   it no longer matches the plugin target, nor will it match
761
   RIGHT_TARG again.  */
762
81.8k
      if (match_targ != right_targ)
763
29.5k
  {
764
29.5k
    bfd_reinit (abfd, initial_section_id, &preserve, cleanup);
765
29.5k
    bfd_release (abfd, preserve.marker);
766
29.5k
    if (bfd_seek (abfd, 0, SEEK_SET) != 0)
767
0
      goto err_ret;
768
29.5k
    cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
769
29.5k
    BFD_ASSERT (cleanup != NULL);
770
29.5k
  }
771
772
135k
    ok_ret:
773
      /* If the file was opened for update, then `output_has_begun'
774
   some time ago when the file was created.  Do not recompute
775
   sections sizes or alignments in _bfd_set_section_contents.
776
   We can not set this flag until after checking the format,
777
   because it will interfere with creation of BFD sections.  */
778
135k
      if (abfd->direction == both_direction)
779
16.7k
  abfd->output_has_begun = true;
780
781
135k
      free (matching_vector);
782
135k
      if (preserve_match.marker != NULL)
783
0
  bfd_preserve_finish (abfd, &preserve_match);
784
135k
      bfd_preserve_finish (abfd, &preserve);
785
135k
      _bfd_restore_error_handler_caching (orig_messages);
786
787
135k
      print_and_clear_messages (&messages, abfd->xvec);
788
789
135k
      bfd_set_lto_type (abfd);
790
791
      /* File position has moved, BTW.  */
792
135k
      bool ret = bfd_cache_set_uncloseable (abfd, old_in_format_matches, NULL);
793
135k
      if (!bfd_unlock ())
794
0
  return false;
795
135k
      return ret;
796
135k
    }
797
798
87.0k
  if (match_count == 0)
799
75.3k
    {
800
8.65M
    err_unrecog:
801
8.65M
      bfd_set_error (bfd_error_file_not_recognized);
802
8.65M
    err_ret:
803
8.65M
      if (cleanup)
804
0
  cleanup (abfd);
805
8.65M
      abfd->xvec = save_targ;
806
8.65M
      abfd->format = bfd_unknown;
807
8.65M
      free (matching_vector);
808
8.65M
      goto out;
809
8.65M
    }
810
811
  /* Restore original target type and format.  */
812
11.7k
  abfd->xvec = save_targ;
813
11.7k
  abfd->format = bfd_unknown;
814
11.7k
  bfd_set_error (bfd_error_file_ambiguously_recognized);
815
816
11.7k
  if (matching)
817
1.53k
    {
818
1.53k
      *matching = (char **) matching_vector;
819
1.53k
      matching_vector[match_count] = NULL;
820
      /* Return target names.  This is a little nasty.  Maybe we
821
   should do another bfd_malloc?  */
822
5.55k
      while (--match_count >= 0)
823
4.01k
  {
824
4.01k
    const char *name = matching_vector[match_count]->name;
825
4.01k
    *(const char **) &matching_vector[match_count] = name;
826
4.01k
  }
827
1.53k
    }
828
10.1k
  else
829
10.1k
    free (matching_vector);
830
11.7k
  if (cleanup)
831
11.7k
    cleanup (abfd);
832
8.66M
 out:
833
8.66M
  if (preserve_match.marker != NULL)
834
0
    bfd_preserve_finish (abfd, &preserve_match);
835
8.66M
  if (preserve.marker != NULL)
836
8.66M
    bfd_preserve_restore (abfd, &preserve);
837
8.66M
  _bfd_restore_error_handler_caching (orig_messages);
838
8.66M
  print_and_clear_messages (&messages, PER_XVEC_NO_TARGET);
839
8.66M
  bfd_cache_set_uncloseable (abfd, old_in_format_matches, NULL);
840
8.66M
  bfd_unlock ();
841
8.66M
  return false;
842
11.7k
}
843
844
/*
845
FUNCTION
846
  bfd_set_format
847
848
SYNOPSIS
849
  bool bfd_set_format (bfd *abfd, bfd_format format);
850
851
DESCRIPTION
852
  This function sets the file format of the BFD @var{abfd} to the
853
  format @var{format}. If the target set in the BFD does not
854
  support the format requested, the format is invalid, or the BFD
855
  is not open for writing, then an error occurs.
856
*/
857
858
bool
859
bfd_set_format (bfd *abfd, bfd_format format)
860
8.87k
{
861
8.87k
  if (bfd_read_p (abfd)
862
8.87k
      || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
863
0
    {
864
0
      bfd_set_error (bfd_error_invalid_operation);
865
0
      return false;
866
0
    }
867
868
8.87k
  if (abfd->format != bfd_unknown)
869
2.01k
    return abfd->format == format;
870
871
  /* Presume the answer is yes.  */
872
6.86k
  abfd->format = format;
873
874
6.86k
  if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd)))
875
3.68k
    {
876
3.68k
      abfd->format = bfd_unknown;
877
3.68k
      return false;
878
3.68k
    }
879
880
3.17k
  return true;
881
6.86k
}
882
883
/*
884
FUNCTION
885
  bfd_format_string
886
887
SYNOPSIS
888
  const char *bfd_format_string (bfd_format format);
889
890
DESCRIPTION
891
  Return a pointer to a const string
892
  <<invalid>>, <<object>>, <<archive>>, <<core>>, or <<unknown>>,
893
  depending upon the value of @var{format}.
894
*/
895
896
const char *
897
bfd_format_string (bfd_format format)
898
0
{
899
0
  if (((int) format < (int) bfd_unknown)
900
0
      || ((int) format >= (int) bfd_type_end))
901
0
    return "invalid";
902
903
0
  switch (format)
904
0
    {
905
0
    case bfd_object:
906
0
      return "object";   /* Linker/assembler/compiler output.  */
907
0
    case bfd_archive:
908
0
      return "archive";   /* Object archive file.  */
909
0
    case bfd_core:
910
0
      return "core";   /* Core dump.  */
911
0
    default:
912
0
      return "unknown";
913
0
    }
914
0
}