Coverage Report

Created: 2026-07-25 10:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/opncls.c
Line
Count
Source
1
/* opncls.c -- open and close a BFD.
2
   Copyright (C) 1990-2026 Free Software Foundation, Inc.
3
4
   Written by Cygnus Support.
5
6
   This file is part of BFD, the Binary File Descriptor library.
7
8
   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
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
23
#include "sysdep.h"
24
#include "bfd.h"
25
#include "objalloc.h"
26
#include "libbfd.h"
27
#include "libiberty.h"
28
#include "elf-bfd.h"
29
30
#ifndef S_IXUSR
31
#define S_IXUSR 0100  /* Execute by owner.  */
32
#endif
33
#ifndef S_IXGRP
34
#define S_IXGRP 0010  /* Execute by group.  */
35
#endif
36
#ifndef S_IXOTH
37
#define S_IXOTH 0001  /* Execute by others.  */
38
#endif
39
40
/*
41
SECTION
42
  Opening and closing BFDs
43
44
SUBSECTION
45
  Functions for opening and closing
46
*/
47
48
/* Counter used to initialize the unique bfd identifier.  */
49
50
static unsigned int bfd_id_counter = 0;
51
52
/* fdopen is a loser -- we should use stdio exclusively.  Unfortunately
53
   if we do that we can't use fcntl.  */
54
55
/*
56
INTERNAL_FUNCTION
57
  _bfd_new_bfd
58
59
SYNOPSIS
60
  bfd *_bfd_new_bfd (void);
61
62
DESCRIPTION
63
  Return a new BFD.  All BFD's are allocated through this routine.
64
*/
65
66
bfd *
67
_bfd_new_bfd (void)
68
11.6M
{
69
11.6M
  bfd *nbfd;
70
71
11.6M
  nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
72
11.6M
  if (nbfd == NULL)
73
0
    return NULL;
74
75
11.6M
  if (!bfd_lock ())
76
0
    goto loser;
77
11.6M
  nbfd->id = bfd_id_counter++;
78
11.6M
  if (!bfd_unlock ())
79
0
    goto loser;
80
81
11.6M
  nbfd->memory = objalloc_create ();
82
11.6M
  if (nbfd->memory == NULL)
83
0
    {
84
0
      bfd_set_error (bfd_error_no_memory);
85
0
      goto loser;
86
0
    }
87
88
11.6M
  nbfd->arch_info = &bfd_default_arch_struct;
89
90
11.6M
  if (!bfd_hash_table_init_n (& nbfd->section_htab, bfd_section_hash_newfunc,
91
11.6M
            sizeof (struct section_hash_entry), 13))
92
0
    {
93
0
      objalloc_free (nbfd->memory);
94
0
      goto loser;
95
0
    }
96
97
11.6M
  nbfd->archive_plugin_fd = -1;
98
11.6M
  return nbfd;
99
100
0
 loser:
101
0
  free (nbfd);
102
0
  return NULL;
103
11.6M
}
104
105
static const struct bfd_iovec opncls_iovec;
106
107
/*
108
INTERNAL_FUNCTION
109
  _bfd_new_bfd_contained_in
110
111
SYNOPSIS
112
  bfd *_bfd_new_bfd_contained_in (bfd *);
113
114
DESCRIPTION
115
  Allocate a new BFD as a member of archive OBFD.
116
*/
117
118
bfd *
119
_bfd_new_bfd_contained_in (bfd *obfd)
120
11.3M
{
121
11.3M
  bfd *nbfd;
122
123
  /* Nested archives in bims are unsupported.  */
124
11.3M
  if ((obfd->flags & BFD_IN_MEMORY) != 0)
125
0
    {
126
0
      bfd_set_error (bfd_error_malformed_archive);
127
0
      return NULL;
128
0
    }
129
11.3M
  nbfd = _bfd_new_bfd ();
130
11.3M
  if (nbfd == NULL)
131
0
    return NULL;
132
11.3M
  nbfd->xvec = obfd->xvec;
133
11.3M
  nbfd->iovec = obfd->iovec;
134
11.3M
  if (obfd->iovec == &opncls_iovec)
135
0
    nbfd->iostream = obfd->iostream;
136
11.3M
  nbfd->my_archive = obfd;
137
11.3M
  nbfd->direction = read_direction;
138
11.3M
  nbfd->target_defaulted = obfd->target_defaulted;
139
11.3M
  nbfd->lto_output = obfd->lto_output;
140
11.3M
  nbfd->no_export = obfd->no_export;
141
11.3M
  return nbfd;
142
11.3M
}
143
144
/* Delete a BFD.  */
145
146
static void
147
_bfd_delete_bfd (bfd *abfd)
148
11.6M
{
149
  /* Give the target _bfd_free_cached_info a chance to free memory.  */
150
11.6M
  if (abfd->memory && abfd->xvec)
151
11.6M
    bfd_free_cached_info (abfd);
152
153
  /* The target _bfd_free_cached_info may not have done anything..  */
154
11.6M
  bfd_hash_table_free (&abfd->section_htab);
155
11.6M
  if (abfd->memory)
156
11.6M
    objalloc_free (abfd->memory);
157
158
11.6M
#ifdef USE_MMAP
159
11.6M
  struct bfd_mmapped *mmapped, *next;
160
11.6M
  for (mmapped = abfd->mmapped; mmapped != NULL; mmapped = next)
161
2
    {
162
2
      struct bfd_mmapped_entry *entries = mmapped->entries;
163
2
      next = mmapped->next;
164
9
      for (unsigned int i = 0; i < mmapped->next_entry; i++)
165
7
  munmap (entries[i].addr, entries[i].size);
166
2
      munmap (mmapped, _bfd_pagesize);
167
2
    }
168
11.6M
#endif
169
170
11.6M
  free (abfd->arelt_data);
171
11.6M
  free (abfd);
172
11.6M
}
173
174
/*
175
INTERNAL_FUNCTION
176
  _bfd_free_cached_info
177
178
SYNOPSIS
179
  bool _bfd_free_cached_info (bfd *);
180
181
DESCRIPTION
182
  Free objalloc memory.
183
*/
184
185
bool
186
_bfd_free_cached_info (bfd *abfd)
187
11.2M
{
188
11.2M
  bfd_hash_table_free (&abfd->section_htab);
189
190
11.2M
  abfd->sections = NULL;
191
11.2M
  abfd->section_last = NULL;
192
11.2M
  abfd->section_count = 0;
193
11.2M
  abfd->outsymbols = NULL;
194
11.2M
  abfd->tdata.any = NULL;
195
11.2M
  abfd->usrdata = NULL;
196
11.2M
  abfd->format = bfd_unknown;
197
198
11.2M
  return true;
199
11.2M
}
200
201
/*
202
FUNCTION
203
  bfd_fopen
204
205
SYNOPSIS
206
  bfd *bfd_fopen (const char *filename, const char *target,
207
      const char *mode, int fd);
208
209
DESCRIPTION
210
  Open the file @var{filename} with the target @var{target}.
211
  Return a pointer to the created BFD.  If @var{fd} is not -1,
212
  then <<fdopen>> is used to open the file; otherwise, <<fopen>>
213
  is used.  @var{mode} is passed directly to <<fopen>> or
214
  <<fdopen>>.
215
216
  Calls <<bfd_find_target>>, so @var{target} is interpreted as by
217
  that function.
218
219
  The new BFD is marked as cacheable iff @var{fd} is -1.
220
221
  If <<NULL>> is returned then an error has occured.   Possible errors
222
  are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
223
  <<system_call>> error.
224
225
  On error, @var{fd} is always closed.
226
227
  A copy of the @var{filename} argument is stored in the newly created
228
  BFD.  It can be accessed via the bfd_get_filename() macro.
229
*/
230
231
bfd *
232
bfd_fopen (const char *filename, const char *target, const char *mode, int fd)
233
231k
{
234
231k
  bfd *nbfd;
235
231k
  const bfd_target *target_vec;
236
237
231k
  nbfd = _bfd_new_bfd ();
238
231k
  if (nbfd == NULL)
239
0
    {
240
0
      if (fd != -1)
241
0
  close (fd);
242
0
      return NULL;
243
0
    }
244
245
231k
  target_vec = bfd_find_target (target, nbfd);
246
231k
  if (target_vec == NULL)
247
27
    {
248
27
      if (fd != -1)
249
0
  close (fd);
250
27
      _bfd_delete_bfd (nbfd);
251
27
      return NULL;
252
27
    }
253
254
231k
#ifdef HAVE_FDOPEN
255
231k
  if (fd != -1)
256
23.2k
    nbfd->iostream = fdopen (fd, mode);
257
208k
  else
258
208k
#endif
259
208k
    nbfd->iostream = _bfd_real_fopen (filename, mode);
260
231k
  if (nbfd->iostream == NULL)
261
3.17k
    {
262
3.17k
      bfd_set_error (bfd_error_system_call);
263
3.17k
      if (fd != -1)
264
0
  close (fd);
265
3.17k
      _bfd_delete_bfd (nbfd);
266
3.17k
      return NULL;
267
3.17k
    }
268
269
  /* OK, put everything where it belongs.  */
270
271
  /* PR 11983: Do not cache the original filename, but
272
     rather make a copy - the original might go away.  */
273
228k
  if (!bfd_set_filename (nbfd, filename))
274
0
    {
275
0
      fclose (nbfd->iostream);
276
0
      _bfd_delete_bfd (nbfd);
277
0
      return NULL;
278
0
    }
279
280
  /* Figure out whether the user is opening the file for reading,
281
     writing, or both, by looking at the MODE argument.  */
282
228k
  if ((mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a')
283
228k
      && mode[1] == '+')
284
23.2k
    nbfd->direction = both_direction;
285
204k
  else if (mode[0] == 'r')
286
204k
    nbfd->direction = read_direction;
287
0
  else
288
0
    nbfd->direction = write_direction;
289
290
228k
  if (!bfd_cache_init (nbfd))
291
0
    {
292
0
      fclose (nbfd->iostream);
293
0
      _bfd_delete_bfd (nbfd);
294
0
      return NULL;
295
0
    }
296
228k
  nbfd->opened_once = true;
297
298
  /* If we opened the file by name, mark it cacheable; we can close it
299
     and reopen it later.  However, if a file descriptor was provided,
300
     then it may have been opened with special flags that make it
301
     unsafe to close and reopen the file.  */
302
228k
  if (fd == -1)
303
204k
    (void) bfd_set_cacheable (nbfd, true);
304
305
228k
  return nbfd;
306
228k
}
307
308
/*
309
FUNCTION
310
  bfd_openr
311
312
SYNOPSIS
313
  bfd *bfd_openr (const char *filename, const char *target);
314
315
DESCRIPTION
316
  Open the file @var{filename} (using <<fopen>>) with the target
317
  @var{target}.  Return a pointer to the created BFD.
318
319
  Calls <<bfd_find_target>>, so @var{target} is interpreted as by
320
  that function.
321
322
  If <<NULL>> is returned then an error has occured.   Possible errors
323
  are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
324
  <<system_call>> error.
325
326
  A copy of the @var{filename} argument is stored in the newly created
327
  BFD.  It can be accessed via the bfd_get_filename() macro.
328
*/
329
330
bfd *
331
bfd_openr (const char *filename, const char *target)
332
208k
{
333
208k
  return bfd_fopen (filename, target, FOPEN_RB, -1);
334
208k
}
335
336
/* Don't try to `optimize' this function:
337
338
   o - We lock using stack space so that interrupting the locking
339
       won't cause a storage leak.
340
   o - We open the file stream last, since we don't want to have to
341
       close it if anything goes wrong.  Closing the stream means closing
342
       the file descriptor too, even though we didn't open it.  */
343
/*
344
FUNCTION
345
  bfd_fdopenr
346
347
SYNOPSIS
348
  bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
349
350
DESCRIPTION
351
  <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
352
  <<fopen>>.  It opens a BFD on a file already described by the
353
  @var{fd} supplied.
354
355
  When the file is later <<bfd_close>>d, the file descriptor will
356
  be closed.  If the caller desires that this file descriptor be
357
  cached by BFD (opened as needed, closed as needed to free
358
  descriptors for other opens), with the supplied @var{fd} used as
359
  an initial file descriptor (but subject to closure at any time),
360
  call bfd_set_cacheable(bfd, 1) on the returned BFD.  The default
361
  is to assume no caching; the file descriptor will remain open
362
  until <<bfd_close>>, and will not be affected by BFD operations
363
  on other files.
364
365
  Possible errors are <<bfd_error_no_memory>>,
366
  <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
367
368
  On error, @var{fd} is closed.
369
370
  A copy of the @var{filename} argument is stored in the newly created
371
  BFD.  It can be accessed via the bfd_get_filename() macro.
372
*/
373
374
bfd *
375
bfd_fdopenr (const char *filename, const char *target, int fd)
376
23.2k
{
377
23.2k
  const char *mode;
378
23.2k
#if defined(HAVE_FCNTL) && defined(F_GETFL)
379
23.2k
  int fdflags;
380
23.2k
#endif
381
382
#if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
383
  mode = FOPEN_RUB; /* Assume full access.  */
384
#else
385
23.2k
  fdflags = fcntl (fd, F_GETFL, NULL);
386
23.2k
  if (fdflags == -1)
387
0
    {
388
0
      int save = errno;
389
390
0
      close (fd);
391
0
      errno = save;
392
0
      bfd_set_error (bfd_error_system_call);
393
0
      return NULL;
394
0
    }
395
396
  /* (O_ACCMODE) parens are to avoid Ultrix header file bug.  */
397
23.2k
  switch (fdflags & (O_ACCMODE))
398
23.2k
    {
399
0
    case O_RDONLY: mode = FOPEN_RB; break;
400
0
    case O_WRONLY: mode = FOPEN_RUB; break;
401
23.2k
    case O_RDWR:   mode = FOPEN_RUB; break;
402
0
    default: abort ();
403
23.2k
    }
404
23.2k
#endif
405
406
23.2k
  return bfd_fopen (filename, target, mode, fd);
407
23.2k
}
408
409
/*
410
FUNCTION
411
  bfd_fdopenw
412
413
SYNOPSIS
414
  bfd *bfd_fdopenw (const char *filename, const char *target, int fd);
415
416
DESCRIPTION
417
  <<bfd_fdopenw>> is exactly like <<bfd_fdopenr>> with the exception that
418
  the resulting BFD is suitable for output.
419
*/
420
421
bfd *
422
bfd_fdopenw (const char *filename, const char *target, int fd)
423
0
{
424
0
  bfd *out = bfd_fdopenr (filename, target, fd);
425
426
0
  if (out != NULL)
427
0
    {
428
0
      if (!bfd_write_p (out))
429
0
  {
430
0
    close (fd);
431
0
    _bfd_delete_bfd (out);
432
0
    out = NULL;
433
0
    bfd_set_error (bfd_error_invalid_operation);
434
0
  }
435
0
      else
436
0
  out->direction = write_direction;
437
0
    }
438
439
0
  return out;
440
0
}
441
442
/*
443
FUNCTION
444
  bfd_openstreamr
445
446
SYNOPSIS
447
  bfd *bfd_openstreamr (const char * filename, const char * target,
448
            void * stream);
449
450
DESCRIPTION
451
  Open a BFD for read access on an existing stdio stream.  When
452
  the BFD is passed to <<bfd_close>>, the stream will be closed.
453
454
  A copy of the @var{filename} argument is stored in the newly created
455
  BFD.  It can be accessed via the bfd_get_filename() macro.
456
*/
457
458
bfd *
459
bfd_openstreamr (const char *filename, const char *target, void *streamarg)
460
0
{
461
0
  FILE *stream = (FILE *) streamarg;
462
0
  bfd *nbfd;
463
0
  const bfd_target *target_vec;
464
465
0
  nbfd = _bfd_new_bfd ();
466
0
  if (nbfd == NULL)
467
0
    return NULL;
468
469
0
  target_vec = bfd_find_target (target, nbfd);
470
0
  if (target_vec == NULL)
471
0
    {
472
0
      _bfd_delete_bfd (nbfd);
473
0
      return NULL;
474
0
    }
475
476
0
  nbfd->iostream = stream;
477
  /* PR 11983: Do not cache the original filename, but
478
     rather make a copy - the original might go away.  */
479
0
  if (!bfd_set_filename (nbfd, filename))
480
0
    {
481
0
      _bfd_delete_bfd (nbfd);
482
0
      return NULL;
483
0
    }
484
0
  nbfd->direction = read_direction;
485
486
0
  if (! bfd_cache_init (nbfd))
487
0
    {
488
0
      _bfd_delete_bfd (nbfd);
489
0
      return NULL;
490
0
    }
491
492
0
  return nbfd;
493
0
}
494
495
/*
496
FUNCTION
497
  bfd_openr_fake_archive
498
499
SYNOPSIS
500
  bfd *bfd_openr_fake_archive (bfd *fbfd);
501
502
DESCRIPTION
503
  Open a list of BFDs starting from @var{fbfd} as an artificial
504
  archive.  Subsequent members of the archive are indicated by each
505
  BFD's proxy_handle.abfd member, with the final one holding a NULL
506
  pointer there.  The newly opened archive will necessarily also be
507
  a thin archive as there will be member files only to refer to and
508
  no containing archive file.
509
*/
510
511
bfd *
512
bfd_openr_fake_archive (bfd *fbfd)
513
0
{
514
0
  bfd *abfd, *nbfd;
515
516
0
  if (fbfd == NULL)
517
0
    return NULL;
518
519
0
  nbfd = _bfd_new_bfd ();
520
0
  if (nbfd == NULL)
521
0
    return NULL;
522
523
0
  nbfd->xvec = fbfd->xvec;
524
0
  bfd_set_format (nbfd, bfd_archive);
525
0
  bfd_set_thin_archive (nbfd, true);
526
0
  bfd_set_fake_archive (nbfd, true);
527
0
  bfd_ardata (nbfd)->first_file.abfd = fbfd;
528
0
  nbfd->direction = read_direction;
529
530
0
  for (abfd = fbfd; abfd != NULL; abfd = abfd->proxy_handle.abfd)
531
0
    abfd->my_archive = nbfd;
532
533
0
  return nbfd;
534
0
}
535
536
/*
537
FUNCTION
538
  bfd_openr_iovec
539
540
SYNOPSIS
541
  bfd *bfd_openr_iovec (const char *filename, const char *target,
542
            void *(*open_func) (struct bfd *nbfd,
543
              void *open_closure),
544
            void *open_closure,
545
            file_ptr (*pread_func) (struct bfd *nbfd,
546
                  void *stream,
547
                  void *buf,
548
                  file_ptr nbytes,
549
                  file_ptr offset),
550
            int (*close_func) (struct bfd *nbfd,
551
             void *stream),
552
            int (*stat_func) (struct bfd *abfd,
553
            void *stream,
554
            struct stat *sb));
555
556
DESCRIPTION
557
  Create and return a BFD backed by a read-only @var{stream}.
558
  The @var{stream} is created using @var{open_func}, accessed using
559
  @var{pread_func} and destroyed using @var{close_func}.
560
561
  Calls <<bfd_find_target>>, so @var{target} is interpreted as by
562
  that function.
563
564
  Calls @var{open_func} (which can call <<bfd_zalloc>> and
565
  <<bfd_get_filename>>) to obtain the read-only stream backing
566
  the BFD.  @var{open_func} either succeeds returning the
567
  non-<<NULL>> @var{stream}, or fails returning <<NULL>>
568
  (setting <<bfd_error>>).
569
570
  Calls @var{pread_func} to request @var{nbytes} of data from
571
  @var{stream} starting at @var{offset} (e.g., via a call to
572
  <<bfd_read>>).  @var{pread_func} either succeeds returning the
573
  number of bytes read (which can be less than @var{nbytes} when
574
  end-of-file), or fails returning -1 (setting <<bfd_error>>).
575
576
  Calls @var{close_func} when the BFD is later closed using
577
  <<bfd_close>>.  @var{close_func} either succeeds returning 0, or
578
  fails returning -1 (setting <<bfd_error>>).
579
580
  Calls @var{stat_func} to fill in a stat structure for bfd_stat,
581
  bfd_get_size, and bfd_get_mtime calls.  @var{stat_func} returns 0
582
  on success, or returns -1 on failure (setting <<bfd_error>>).
583
584
  If <<bfd_openr_iovec>> returns <<NULL>> then an error has
585
  occurred.  Possible errors are <<bfd_error_no_memory>>,
586
  <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
587
588
  A copy of the @var{filename} argument is stored in the newly created
589
  BFD.  It can be accessed via the bfd_get_filename() macro.
590
*/
591
592
struct opncls
593
{
594
  void *stream;
595
  file_ptr (*pread) (struct bfd *abfd, void *stream, void *buf,
596
         file_ptr nbytes, file_ptr offset);
597
  int (*close) (struct bfd *abfd, void *stream);
598
  int (*stat) (struct bfd *abfd, void *stream, struct stat *sb);
599
  file_ptr where;
600
};
601
602
static file_ptr
603
opncls_btell (struct bfd *abfd)
604
0
{
605
0
  struct opncls *vec = (struct opncls *) abfd->iostream;
606
0
  return vec->where;
607
0
}
608
609
static int
610
opncls_bseek (struct bfd *abfd, file_ptr offset, int whence)
611
0
{
612
0
  struct opncls *vec = (struct opncls *) abfd->iostream;
613
0
  switch (whence)
614
0
    {
615
0
    case SEEK_SET: vec->where = offset; break;
616
0
    case SEEK_CUR: vec->where += offset; break;
617
0
    case SEEK_END: return -1;
618
0
    }
619
0
  return 0;
620
0
}
621
622
static file_ptr
623
opncls_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
624
0
{
625
0
  struct opncls *vec = (struct opncls *) abfd->iostream;
626
0
  file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where);
627
628
0
  if (nread < 0)
629
0
    return nread;
630
0
  vec->where += nread;
631
0
  return nread;
632
0
}
633
634
static file_ptr
635
opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED,
636
        const void *where ATTRIBUTE_UNUSED,
637
        file_ptr nbytes ATTRIBUTE_UNUSED)
638
0
{
639
0
  return -1;
640
0
}
641
642
static int
643
opncls_bclose (struct bfd *abfd)
644
0
{
645
0
  struct opncls *vec = (struct opncls *) abfd->iostream;
646
  /* Since the VEC's memory is bound to the bfd deleting the bfd will
647
     free it.  */
648
0
  int status = 0;
649
650
0
  if (vec->close != NULL)
651
0
    status = (vec->close) (abfd, vec->stream);
652
0
  abfd->iostream = NULL;
653
0
  return status;
654
0
}
655
656
static int
657
opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
658
0
{
659
0
  return 0;
660
0
}
661
662
static int
663
opncls_bstat (struct bfd *abfd, struct stat *sb)
664
0
{
665
0
  struct opncls *vec = (struct opncls *) abfd->iostream;
666
667
0
  memset (sb, 0, sizeof (*sb));
668
0
  if (vec->stat == NULL)
669
0
    return 0;
670
671
0
  return (vec->stat) (abfd, vec->stream, sb);
672
0
}
673
674
static void *
675
opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
676
        void *addr ATTRIBUTE_UNUSED,
677
        size_t len ATTRIBUTE_UNUSED,
678
        int prot ATTRIBUTE_UNUSED,
679
        int flags ATTRIBUTE_UNUSED,
680
        file_ptr offset ATTRIBUTE_UNUSED,
681
        void **map_addr ATTRIBUTE_UNUSED,
682
        size_t *map_len ATTRIBUTE_UNUSED)
683
0
{
684
0
  return MAP_FAILED;
685
0
}
686
687
static const struct bfd_iovec opncls_iovec =
688
{
689
  &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
690
  &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
691
};
692
693
bfd *
694
bfd_openr_iovec (const char *filename, const char *target,
695
     void *(*open_p) (struct bfd *, void *),
696
     void *open_closure,
697
     file_ptr (*pread_p) (struct bfd *, void *, void *,
698
              file_ptr, file_ptr),
699
     int (*close_p) (struct bfd *, void *),
700
     int (*stat_p) (struct bfd *, void *, struct stat *))
701
0
{
702
0
  bfd *nbfd;
703
0
  const bfd_target *target_vec;
704
0
  struct opncls *vec;
705
0
  void *stream;
706
707
0
  nbfd = _bfd_new_bfd ();
708
0
  if (nbfd == NULL)
709
0
    return NULL;
710
711
0
  target_vec = bfd_find_target (target, nbfd);
712
0
  if (target_vec == NULL)
713
0
    {
714
0
      _bfd_delete_bfd (nbfd);
715
0
      return NULL;
716
0
    }
717
718
  /* PR 11983: Do not cache the original filename, but
719
     rather make a copy - the original might go away.  */
720
0
  if (!bfd_set_filename (nbfd, filename))
721
0
    {
722
0
      _bfd_delete_bfd (nbfd);
723
0
      return NULL;
724
0
    }
725
0
  nbfd->direction = read_direction;
726
727
  /* `open_p (...)' would get expanded by an the open(2) syscall macro.  */
728
0
  stream = (*open_p) (nbfd, open_closure);
729
0
  if (stream == NULL)
730
0
    {
731
0
      _bfd_delete_bfd (nbfd);
732
0
      return NULL;
733
0
    }
734
735
0
  vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls));
736
0
  vec->stream = stream;
737
0
  vec->pread = pread_p;
738
0
  vec->close = close_p;
739
0
  vec->stat = stat_p;
740
741
0
  nbfd->iovec = &opncls_iovec;
742
0
  nbfd->iostream = vec;
743
744
0
  return nbfd;
745
0
}
746

747
/* bfd_openw -- open for writing.
748
   Returns a pointer to a freshly-allocated BFD on success, or NULL.
749
750
   See comment by bfd_fdopenr before you try to modify this function.  */
751
752
/*
753
FUNCTION
754
  bfd_openw
755
756
SYNOPSIS
757
  bfd *bfd_openw (const char *filename, const char *target);
758
759
DESCRIPTION
760
  Create a BFD, associated with file @var{filename}, using the
761
  file format @var{target}, and return a pointer to it.
762
763
  Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
764
  <<bfd_error_invalid_target>>.
765
766
  A copy of the @var{filename} argument is stored in the newly created
767
  BFD.  It can be accessed via the bfd_get_filename() macro.
768
*/
769
770
bfd *
771
bfd_openw (const char *filename, const char *target)
772
28.4k
{
773
28.4k
  bfd *nbfd;
774
28.4k
  const bfd_target *target_vec;
775
776
  /* nbfd has to point to head of malloc'ed block so that bfd_close may
777
     reclaim it correctly.  */
778
28.4k
  nbfd = _bfd_new_bfd ();
779
28.4k
  if (nbfd == NULL)
780
0
    return NULL;
781
782
28.4k
  target_vec = bfd_find_target (target, nbfd);
783
28.4k
  if (target_vec == NULL)
784
0
    {
785
0
      _bfd_delete_bfd (nbfd);
786
0
      return NULL;
787
0
    }
788
789
  /* PR 11983: Do not cache the original filename, but
790
     rather make a copy - the original might go away.  */
791
28.4k
  if (!bfd_set_filename (nbfd, filename))
792
0
    {
793
0
      _bfd_delete_bfd (nbfd);
794
0
      return NULL;
795
0
    }
796
28.4k
  nbfd->direction = write_direction;
797
798
28.4k
  if (bfd_open_file (nbfd) == NULL)
799
955
    {
800
      /* File not writeable, etc.  */
801
955
      bfd_set_error (bfd_error_system_call);
802
955
      _bfd_delete_bfd (nbfd);
803
955
      return NULL;
804
955
  }
805
806
27.4k
  return nbfd;
807
28.4k
}
808
809
/*
810
FUNCTION
811
  bfd_elf_bfd_from_remote_memory
812
813
SYNOPSIS
814
  bfd *bfd_elf_bfd_from_remote_memory
815
    (bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep,
816
     int (*target_read_memory)
817
       (bfd_vma vma, bfd_byte *myaddr, bfd_size_type len));
818
819
DESCRIPTION
820
  Create a new BFD as if by bfd_openr.  Rather than opening a
821
  file, reconstruct an ELF file by reading the segments out of
822
  remote memory based on the ELF file header at EHDR_VMA and the
823
  ELF program headers it points to.  If non-zero, SIZE is the
824
  known extent of the object.  If not null, *LOADBASEP is filled
825
  in with the difference between the VMAs from which the
826
  segments were read, and the VMAs the file headers (and hence
827
  BFD's idea of each section's VMA) put them at.
828
829
  The function TARGET_READ_MEMORY is called to copy LEN bytes
830
  from the remote memory at target address VMA into the local
831
  buffer at MYADDR; it should return zero on success or an
832
  errno code on failure.  TEMPL must be a BFD for an ELF
833
  target with the word size and byte order found in the remote
834
  memory.
835
*/
836
837
bfd *
838
bfd_elf_bfd_from_remote_memory
839
  (bfd *templ,
840
   bfd_vma ehdr_vma,
841
   bfd_size_type size,
842
   bfd_vma *loadbasep,
843
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
844
0
{
845
0
  if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
846
0
    {
847
0
      bfd_set_error (bfd_error_invalid_operation);
848
0
      return NULL;
849
0
    }
850
0
  return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
851
0
    (templ, ehdr_vma, size, loadbasep, target_read_memory);
852
0
}
853
854
static inline void
855
_maybe_make_executable (bfd * abfd)
856
11.6M
{
857
  /* If the file was open for writing and is now executable,
858
     make it so.  */
859
11.6M
  if (abfd->direction == write_direction
860
31.4k
      && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
861
5.98k
    {
862
5.98k
      struct stat buf;
863
864
5.98k
      if (stat (bfd_get_filename (abfd), &buf) == 0
865
    /* Do not attempt to change non-regular files.  This is
866
       here especially for configure scripts and kernel builds
867
       which run tests with "ld [...] -o /dev/null".  */
868
5.98k
    && S_ISREG(buf.st_mode))
869
5.98k
  {
870
5.98k
    unsigned int mask = umask (0);
871
872
5.98k
    umask (mask);
873
5.98k
    chmod (bfd_get_filename (abfd),
874
5.98k
     (0777
875
5.98k
      & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
876
5.98k
  }
877
5.98k
    }
878
11.6M
}
879
880
/*
881
FUNCTION
882
  bfd_close
883
884
SYNOPSIS
885
  bool bfd_close (bfd *abfd);
886
887
DESCRIPTION
888
  Close a BFD. If the BFD was open for writing, then pending
889
  operations are completed and the file written out and closed.
890
  If the created file is executable, then <<chmod>> is called
891
  to mark it as such.
892
893
  All memory attached to the BFD is released.
894
895
  The file descriptor associated with the BFD is closed (even
896
  if it was passed in to BFD by <<bfd_fdopenr>>).
897
898
  <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
899
*/
900
901
bool
902
bfd_close (bfd *abfd)
903
11.5M
{
904
11.5M
  bool ret = (!bfd_write_p (abfd)
905
32.7k
        || BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)));
906
907
11.5M
  return bfd_close_all_done (abfd) && ret;
908
11.5M
}
909
910
/*
911
FUNCTION
912
  bfd_close_all_done
913
914
SYNOPSIS
915
  bool bfd_close_all_done (bfd *);
916
917
DESCRIPTION
918
  Close a BFD.  Differs from <<bfd_close>> since it does not
919
  complete any pending operations.  This routine would be used
920
  if the application had just used BFD for swapping and didn't
921
  want to use any of the writing code.
922
923
  If the created file is executable, then <<chmod>> is called
924
  to mark it as such.
925
926
  All memory attached to the BFD is released.
927
928
  <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
929
*/
930
931
bool
932
bfd_close_all_done (bfd *abfd)
933
11.6M
{
934
11.6M
  bool ret = BFD_SEND (abfd, _close_and_cleanup, (abfd));
935
936
11.6M
  if (abfd->iovec != NULL)
937
11.6M
    ret &= abfd->iovec->bclose (abfd) == 0;
938
939
11.6M
  if (ret)
940
11.6M
    _maybe_make_executable (abfd);
941
942
11.6M
  _bfd_delete_bfd (abfd);
943
944
11.6M
  return ret;
945
11.6M
}
946
947
/*
948
FUNCTION
949
  bfd_create
950
951
SYNOPSIS
952
  bfd *bfd_create (const char *filename, bfd *templ);
953
954
DESCRIPTION
955
  Create a new BFD in the manner of <<bfd_openw>>, but without
956
  opening a file. The new BFD takes the target from the target
957
  used by @var{templ}. The format is always set to <<bfd_object>>.
958
959
  A copy of the @var{filename} argument is stored in the newly created
960
  BFD.  It can be accessed via the bfd_get_filename() macro.
961
*/
962
963
bfd *
964
bfd_create (const char *filename, bfd *templ)
965
4.01k
{
966
4.01k
  bfd *nbfd;
967
968
4.01k
  nbfd = _bfd_new_bfd ();
969
4.01k
  if (nbfd == NULL)
970
0
    return NULL;
971
  /* PR 11983: Do not cache the original filename, but
972
     rather make a copy - the original might go away.  */
973
4.01k
  if (!bfd_set_filename (nbfd, filename))
974
0
    {
975
0
      _bfd_delete_bfd (nbfd);
976
0
      return NULL;
977
0
    }
978
4.01k
  if (templ)
979
4.01k
    nbfd->xvec = templ->xvec;
980
4.01k
  nbfd->direction = no_direction;
981
4.01k
  bfd_set_format (nbfd, bfd_object);
982
983
4.01k
  return nbfd;
984
4.01k
}
985
986
/*
987
FUNCTION
988
  bfd_make_writable
989
990
SYNOPSIS
991
  bool bfd_make_writable (bfd *abfd);
992
993
DESCRIPTION
994
  Takes a BFD as created by <<bfd_create>> and converts it
995
  into one like as returned by <<bfd_openw>>.  It does this
996
  by converting the BFD to BFD_IN_MEMORY.  It's assumed that
997
  you will call <<bfd_make_readable>> on this bfd later.
998
999
  <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
1000
*/
1001
1002
bool
1003
bfd_make_writable (bfd *abfd)
1004
4.01k
{
1005
4.01k
  struct bfd_in_memory *bim;
1006
1007
4.01k
  if (abfd->direction != no_direction)
1008
0
    {
1009
0
      bfd_set_error (bfd_error_invalid_operation);
1010
0
      return false;
1011
0
    }
1012
1013
4.01k
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1014
4.01k
  if (bim == NULL)
1015
0
    return false; /* bfd_error already set.  */
1016
4.01k
  abfd->iostream = bim;
1017
  /* bfd_write will grow these as needed.  */
1018
4.01k
  bim->size = 0;
1019
4.01k
  bim->buffer = 0;
1020
1021
4.01k
  abfd->flags |= BFD_IN_MEMORY;
1022
4.01k
  abfd->iovec = &_bfd_memory_iovec;
1023
4.01k
  abfd->origin = 0;
1024
4.01k
  abfd->direction = write_direction;
1025
4.01k
  abfd->where = 0;
1026
1027
4.01k
  return true;
1028
4.01k
}
1029
1030
/*
1031
FUNCTION
1032
  bfd_make_readable
1033
1034
SYNOPSIS
1035
  bool bfd_make_readable (bfd *abfd);
1036
1037
DESCRIPTION
1038
  Takes a BFD as created by <<bfd_create>> and
1039
  <<bfd_make_writable>> and converts it into one like as
1040
  returned by <<bfd_openr>>.  It does this by writing the
1041
  contents out to the memory buffer, then reversing the
1042
  direction.
1043
1044
  <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
1045
1046
bool
1047
bfd_make_readable (bfd *abfd)
1048
0
{
1049
0
  if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
1050
0
    {
1051
0
      bfd_set_error (bfd_error_invalid_operation);
1052
0
      return false;
1053
0
    }
1054
1055
0
  if (!BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
1056
0
    return false;
1057
1058
0
  if (!BFD_SEND (abfd, _bfd_free_cached_info, (abfd)))
1059
0
    return false;
1060
1061
0
  if (!BFD_SEND (abfd, _close_and_cleanup, (abfd)))
1062
0
    return false;
1063
1064
0
  _bfd_free_cached_info (abfd);
1065
0
  if (!bfd_hash_table_init_n (&abfd->section_htab, bfd_section_hash_newfunc,
1066
0
            sizeof (struct section_hash_entry), 13))
1067
0
    return false;
1068
1069
0
  abfd->arch_info = &bfd_default_arch_struct;
1070
1071
0
  abfd->where = 0;
1072
0
  abfd->my_archive = NULL;
1073
0
  abfd->origin = 0;
1074
0
  abfd->opened_once = false;
1075
0
  abfd->output_has_begun = false;
1076
0
  abfd->cacheable = false;
1077
0
  abfd->mtime_set = false;
1078
1079
0
  abfd->target_defaulted = true;
1080
0
  abfd->direction = read_direction;
1081
0
  abfd->symcount = 0;
1082
0
  abfd->size = 0;
1083
1084
0
  bfd_check_format (abfd, bfd_object);
1085
1086
0
  return true;
1087
0
}
1088
1089
/*
1090
   GNU Extension: separate debug-info files
1091
1092
   The idea here is that a special section called .gnu_debuglink might be
1093
   embedded in a binary file, which indicates that some *other* file
1094
   contains the real debugging information. This special section contains a
1095
   filename and CRC32 checksum, which we read and resolve to another file,
1096
   if it exists.
1097
1098
   This facilitates "optional" provision of debugging information, without
1099
   having to provide two complete copies of every binary object (with and
1100
   without debug symbols).  */
1101
1102
4.18k
#define GNU_DEBUGLINK   ".gnu_debuglink"
1103
0
#define GNU_DEBUGALTLINK  ".gnu_debugaltlink"
1104
1105
/*
1106
FUNCTION
1107
  bfd_calc_gnu_debuglink_crc32
1108
1109
SYNOPSIS
1110
  uint32_t bfd_calc_gnu_debuglink_crc32
1111
    (uint32_t crc, const bfd_byte *buf, bfd_size_type len);
1112
1113
DESCRIPTION
1114
  Computes a CRC value as used in the .gnu_debuglink section.
1115
  Advances the previously computed @var{crc} value by computing
1116
  and adding in the crc32 for @var{len} bytes of @var{buf}.
1117
1118
  Return the updated CRC32 value.
1119
*/
1120
1121
uint32_t
1122
bfd_calc_gnu_debuglink_crc32 (uint32_t crc,
1123
            const bfd_byte *buf,
1124
            bfd_size_type len)
1125
0
{
1126
0
  static const uint32_t crc32_table[256] =
1127
0
    {
1128
0
      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
1129
0
      0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
1130
0
      0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
1131
0
      0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1132
0
      0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
1133
0
      0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
1134
0
      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
1135
0
      0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1136
0
      0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
1137
0
      0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
1138
0
      0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
1139
0
      0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1140
0
      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
1141
0
      0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
1142
0
      0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
1143
0
      0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1144
0
      0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
1145
0
      0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
1146
0
      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
1147
0
      0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1148
0
      0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
1149
0
      0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
1150
0
      0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
1151
0
      0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1152
0
      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
1153
0
      0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
1154
0
      0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
1155
0
      0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1156
0
      0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
1157
0
      0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
1158
0
      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
1159
0
      0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1160
0
      0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
1161
0
      0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
1162
0
      0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
1163
0
      0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1164
0
      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
1165
0
      0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
1166
0
      0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
1167
0
      0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1168
0
      0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
1169
0
      0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
1170
0
      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
1171
0
      0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1172
0
      0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
1173
0
      0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
1174
0
      0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
1175
0
      0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1176
0
      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
1177
0
      0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
1178
0
      0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
1179
0
      0x2d02ef8d
1180
0
    };
1181
0
  const bfd_byte *end;
1182
1183
0
  crc = ~crc & 0xffffffff;
1184
0
  for (end = buf + len; buf < end; ++ buf)
1185
0
    crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
1186
0
  return ~crc & 0xffffffff;
1187
0
}
1188
1189
1190
/* Extracts the filename and CRC32 value for any separate debug
1191
   information file associated with @var{abfd}.
1192
1193
   The @var{crc32_out} parameter is an untyped pointer because
1194
   this routine is used as a @code{get_func_type} function, but it
1195
   is expected to be a uint32_t pointer.
1196
1197
   Returns the filename of the associated debug information file,
1198
   or NULL if there is no such file.  If the filename was found
1199
   then the contents of @var{crc32_out} are updated to hold the
1200
   corresponding CRC32 value for the file.
1201
1202
   The returned filename is allocated with @code{malloc}; freeing
1203
   it is the responsibility of the caller.  */
1204
1205
static char *
1206
bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out)
1207
4.18k
{
1208
4.18k
  asection *sect;
1209
4.18k
  uint32_t *crc32 = crc32_out;
1210
4.18k
  bfd_byte *contents;
1211
4.18k
  unsigned int crc_offset;
1212
4.18k
  char *name;
1213
4.18k
  bfd_size_type size;
1214
1215
4.18k
  BFD_ASSERT (abfd);
1216
4.18k
  BFD_ASSERT (crc32_out);
1217
1218
4.18k
  sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1219
1220
4.18k
  if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
1221
4.16k
    return NULL;
1222
1223
15
  size = bfd_section_size (sect);
1224
1225
  /* PR 22794: Make sure that the section has a reasonable size.  */
1226
15
  if (size < 8)
1227
2
    return NULL;
1228
1229
13
  if (!bfd_malloc_and_get_section (abfd, sect, &contents))
1230
2
    return NULL;
1231
1232
  /* CRC value is stored after the filename, aligned up to 4 bytes.  */
1233
11
  name = (char *) contents;
1234
  /* PR 17597: Avoid reading off the end of the buffer.  */
1235
11
  crc_offset = strnlen (name, size) + 1;
1236
11
  crc_offset = (crc_offset + 3) & ~3;
1237
11
  if (crc_offset + 4 > size)
1238
3
    {
1239
3
      free (name);
1240
3
      return NULL;
1241
3
    }
1242
1243
8
  *crc32 = bfd_get_32 (abfd, contents + crc_offset);
1244
8
  return name;
1245
11
}
1246
1247
1248
/*
1249
FUNCTION
1250
  bfd_get_debug_link_info
1251
1252
SYNOPSIS
1253
  char *bfd_get_debug_link_info (bfd *abfd, uint32_t *crc32_out);
1254
1255
DESCRIPTION
1256
  Extracts the filename and CRC32 value for any separate debug
1257
  information file associated with @var{abfd}.
1258
1259
  Returns the filename of the associated debug information file,
1260
  or NULL if there is no such file.  If the filename was found
1261
  then the contents of @var{crc32_out} are updated to hold the
1262
  corresponding CRC32 value for the file.
1263
1264
  The returned filename is allocated with @code{malloc}; freeing
1265
  it is the responsibility of the caller.
1266
*/
1267
1268
char *
1269
bfd_get_debug_link_info (bfd *abfd, uint32_t *crc32_out)
1270
0
{
1271
0
  return bfd_get_debug_link_info_1 (abfd, crc32_out);
1272
0
}
1273
1274
/*
1275
FUNCTION
1276
  bfd_get_alt_debug_link_info
1277
1278
SYNOPSIS
1279
  char *bfd_get_alt_debug_link_info (bfd * abfd,
1280
             bfd_size_type *buildid_len,
1281
             bfd_byte **buildid_out);
1282
1283
DESCRIPTION
1284
  Fetch the filename and BuildID value for any alternate debuginfo
1285
  associated with @var{abfd}.  Return NULL if no such info found,
1286
  otherwise return filename and update @var{buildid_len} and
1287
  @var{buildid_out}.  The returned filename and build_id are
1288
  allocated with @code{malloc}; freeing them is the responsibility
1289
  of the caller.
1290
*/
1291
1292
char *
1293
bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
1294
           bfd_byte **buildid_out)
1295
0
{
1296
0
  asection *sect;
1297
0
  bfd_byte *contents;
1298
0
  unsigned int buildid_offset;
1299
0
  char *name;
1300
0
  bfd_size_type size;
1301
1302
0
  BFD_ASSERT (abfd);
1303
0
  BFD_ASSERT (buildid_len);
1304
0
  BFD_ASSERT (buildid_out);
1305
1306
0
  sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK);
1307
1308
0
  if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
1309
0
    return NULL;
1310
1311
0
  size = bfd_section_size (sect);
1312
0
  if (size < 8)
1313
0
    return NULL;
1314
1315
0
  if (!bfd_malloc_and_get_section (abfd, sect, & contents))
1316
0
    return NULL;
1317
1318
  /* BuildID value is stored after the filename.  */
1319
0
  name = (char *) contents;
1320
0
  buildid_offset = strnlen (name, size) + 1;
1321
0
  if (buildid_offset >= bfd_section_size (sect))
1322
0
    return NULL;
1323
1324
0
  *buildid_len = size - buildid_offset;
1325
0
  *buildid_out = bfd_malloc (*buildid_len);
1326
0
  memcpy (*buildid_out, contents + buildid_offset, *buildid_len);
1327
1328
0
  return name;
1329
0
}
1330
1331
/* Checks to see if @var{name} is a file and if its contents match
1332
   @var{crc32}, which is a pointer to a @code{uint32_t}
1333
   containing a CRC32.
1334
1335
   The @var{crc32_p} parameter is an untyped pointer because this
1336
   routine is used as a @code{check_func_type} function.  */
1337
1338
static bool
1339
separate_debug_file_exists (const char *name, void *crc32_p)
1340
15
{
1341
15
  unsigned char buffer[8 * 1024];
1342
15
  uint32_t file_crc = 0;
1343
15
  FILE *f;
1344
15
  bfd_size_type count;
1345
15
  uint32_t crc;
1346
1347
15
  BFD_ASSERT (name);
1348
15
  BFD_ASSERT (crc32_p);
1349
1350
15
  crc = *(uint32_t *) crc32_p;
1351
1352
15
  f = _bfd_real_fopen (name, FOPEN_RB);
1353
15
  if (f == NULL)
1354
15
    return false;
1355
1356
0
  while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
1357
0
    file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
1358
1359
0
  fclose (f);
1360
1361
0
  return crc == file_crc;
1362
15
}
1363
1364
/* Checks to see if @var{name} is a file.  */
1365
1366
static bool
1367
separate_alt_debug_file_exists (const char *name, void *unused ATTRIBUTE_UNUSED)
1368
0
{
1369
0
  FILE *f;
1370
1371
0
  BFD_ASSERT (name);
1372
1373
0
  f = _bfd_real_fopen (name, FOPEN_RB);
1374
0
  if (f == NULL)
1375
0
    return false;
1376
1377
0
  fclose (f);
1378
1379
0
  return true;
1380
0
}
1381
1382
/* Searches for a debug information file corresponding to @var{abfd}.
1383
1384
   The name of the separate debug info file is returned by the
1385
   @var{get} function.  This function scans various fixed locations
1386
   in the filesystem, including the file tree rooted at @var{dir}.
1387
   If the @var{include_dirs} parameter is true then the directory
1388
   components of @var{abfd}'s filename will be included in the
1389
   searched locations.
1390
1391
   @var{data} is passed unmodified to the @var{get} and @var{check}
1392
   functions.  It is generally used to implement build-id-like
1393
   matching in the callback functions.
1394
1395
   Returns the filename of the first file to be found which
1396
   receives a TRUE result from the @var{check} function.
1397
   Returns NULL if no valid file could be found.  */
1398
1399
typedef char * (*get_func_type) (bfd *, void *);
1400
typedef bool (*check_func_type) (const char *, void *);
1401
1402
static char *
1403
find_separate_debug_file (bfd *abfd,
1404
        const char *debug_file_directory,
1405
        bool include_dirs,
1406
        get_func_type get_func,
1407
        check_func_type check_func,
1408
        void *func_data)
1409
8.36k
{
1410
8.36k
  char *base;
1411
8.36k
  char *dir;
1412
8.36k
  char *debugfile;
1413
8.36k
  char *canon_dir;
1414
8.36k
  size_t dirlen;
1415
8.36k
  size_t canon_dirlen;
1416
1417
8.36k
  BFD_ASSERT (abfd);
1418
8.36k
  if (debug_file_directory == NULL)
1419
0
    debug_file_directory = ".";
1420
1421
  /* BFD may have been opened from a stream.  */
1422
8.36k
  if (bfd_get_filename (abfd) == NULL)
1423
0
    {
1424
0
      bfd_set_error (bfd_error_invalid_operation);
1425
0
      return NULL;
1426
0
    }
1427
1428
8.36k
  base = get_func (abfd, func_data);
1429
1430
8.36k
  if (base == NULL)
1431
8.32k
    return NULL;
1432
1433
38
  if (base[0] == '\0')
1434
5
    {
1435
5
      free (base);
1436
5
      bfd_set_error (bfd_error_no_debug_section);
1437
5
      return NULL;
1438
5
    }
1439
1440
33
  if (include_dirs)
1441
3
    {
1442
3
      const char *fname = bfd_get_filename (abfd);
1443
41
      for (dirlen = strlen (fname); dirlen > 0; dirlen--)
1444
41
  if (IS_DIR_SEPARATOR (fname[dirlen - 1]))
1445
3
    break;
1446
1447
3
      dir = (char *) bfd_malloc (dirlen + 1);
1448
3
      if (dir == NULL)
1449
0
  {
1450
0
    free (base);
1451
0
    return NULL;
1452
0
  }
1453
3
      memcpy (dir, fname, dirlen);
1454
3
      dir[dirlen] = '\0';
1455
3
    }
1456
30
  else
1457
30
    {
1458
30
      dir = (char *) bfd_malloc (1);
1459
30
      * dir = 0;
1460
30
      dirlen = 0;
1461
30
    }
1462
1463
  /* Compute the canonical name of the bfd object with all symbolic links
1464
     resolved, for use in the global debugfile directory.  */
1465
33
  canon_dir = lrealpath (bfd_get_filename (abfd));
1466
453
  for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
1467
453
    if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
1468
33
      break;
1469
33
  canon_dir[canon_dirlen] = '\0';
1470
1471
33
#ifndef EXTRA_DEBUG_ROOT1
1472
66
#define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
1473
33
#endif
1474
33
#ifndef EXTRA_DEBUG_ROOT2
1475
66
#define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
1476
33
#endif
1477
1478
33
  debugfile = (char *)
1479
33
      bfd_malloc (strlen (debug_file_directory) + 1
1480
33
      + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
1481
33
      + strlen (".debug/")
1482
33
#ifdef EXTRA_DEBUG_ROOT1
1483
33
      + strlen (EXTRA_DEBUG_ROOT1)
1484
33
#endif
1485
33
#ifdef EXTRA_DEBUG_ROOT2
1486
33
      + strlen (EXTRA_DEBUG_ROOT2)
1487
33
#endif
1488
33
      + strlen (base)
1489
33
      + 1);
1490
33
  if (debugfile == NULL)
1491
0
    goto found; /* Actually this returns NULL.  */
1492
1493
  /* First try in the same directory as the original file.
1494
1495
     FIXME: Strictly speaking if we are using the build-id method,
1496
     (ie include_dirs == FALSE) then we should only check absolute
1497
     paths, not relative ones like this one (and the next one).
1498
     The check is left in however as this allows the binutils
1499
     testsuite to exercise this feature without having to install
1500
     a file into the root filesystem.  (See binutils/testsuite/
1501
     binutils-all/objdump.exp for the test).  */
1502
33
  sprintf (debugfile, "%s%s", dir, base);
1503
33
  if (check_func (debugfile, func_data))
1504
0
    goto found;
1505
1506
  /* Then try in a subdirectory called .debug.  */
1507
33
  sprintf (debugfile, "%s.debug/%s", dir, base);
1508
33
  if (check_func (debugfile, func_data))
1509
0
    goto found;
1510
1511
33
#ifdef EXTRA_DEBUG_ROOT1
1512
  /* Try the first extra debug file root.  */
1513
33
  sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT1,
1514
33
     include_dirs ? canon_dir : "/", base);
1515
33
  if (check_func (debugfile, func_data))
1516
0
    goto found;
1517
33
#endif
1518
1519
33
#ifdef EXTRA_DEBUG_ROOT2
1520
  /* Try the second extra debug file root.  */
1521
33
  sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT2,
1522
33
     include_dirs ? canon_dir : "/", base);
1523
33
  if (check_func (debugfile, func_data))
1524
0
    goto found;
1525
33
#endif
1526
1527
  /* Then try in the global debugfile directory.  */
1528
33
  strcpy (debugfile, debug_file_directory);
1529
33
  dirlen = strlen (debug_file_directory) - 1;
1530
33
  if (include_dirs)
1531
3
    {
1532
3
      if (dirlen > 0
1533
3
    && debug_file_directory[dirlen] != '/'
1534
3
    && canon_dir[0] != '/')
1535
0
  strcat (debugfile, "/");
1536
3
      strcat (debugfile, canon_dir);
1537
3
    }
1538
30
  else
1539
30
    {
1540
30
      if (dirlen > 0 && debug_file_directory[dirlen] != '/')
1541
30
  strcat (debugfile, "/");
1542
30
    }
1543
33
  strcat (debugfile, base);
1544
1545
33
  if (check_func (debugfile, func_data))
1546
0
    goto found;
1547
1548
  /* Failed to find the file.  */
1549
33
  free (debugfile);
1550
33
  debugfile = NULL;
1551
1552
33
 found:
1553
33
  free (base);
1554
33
  free (dir);
1555
33
  free (canon_dir);
1556
33
  return debugfile;
1557
33
}
1558
1559
/*
1560
FUNCTION
1561
  bfd_follow_gnu_debuglink
1562
1563
SYNOPSIS
1564
  char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
1565
1566
DESCRIPTION
1567
  Takes a BFD and searches it for a .gnu_debuglink section.  If this
1568
  section is found, it examines the section for the name and checksum
1569
  of a '.debug' file containing auxiliary debugging information.  It
1570
  then searches the filesystem for this .debug file in some standard
1571
  locations, including the directory tree rooted at @var{dir}, and if
1572
  found returns the full filename.
1573
1574
  If @var{dir} is NULL, the search will take place starting at
1575
  the current directory.
1576
1577
  Returns <<NULL>> on any errors or failure to locate the .debug
1578
  file, otherwise a pointer to a heap-allocated string
1579
  containing the filename.  The caller is responsible for
1580
  freeing this string.
1581
*/
1582
1583
char *
1584
bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
1585
4.18k
{
1586
4.18k
  uint32_t crc32;
1587
1588
4.18k
  return find_separate_debug_file (abfd, dir, true,
1589
4.18k
           bfd_get_debug_link_info_1,
1590
4.18k
           separate_debug_file_exists, &crc32);
1591
4.18k
}
1592
1593
/* Helper for bfd_follow_gnu_debugaltlink.  It just returns the name
1594
   of the separate debug file.  */
1595
1596
static char *
1597
get_alt_debug_link_info_shim (bfd * abfd, void *unused ATTRIBUTE_UNUSED)
1598
0
{
1599
0
  bfd_size_type len;
1600
0
  bfd_byte *buildid = NULL;
1601
0
  char *result = bfd_get_alt_debug_link_info (abfd, &len, &buildid);
1602
1603
0
  free (buildid);
1604
1605
0
  return result;
1606
0
}
1607
1608
/*
1609
FUNCTION
1610
  bfd_follow_gnu_debugaltlink
1611
1612
SYNOPSIS
1613
  char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
1614
1615
DESCRIPTION
1616
  Takes a BFD and searches it for a .gnu_debugaltlink section.  If this
1617
  section is found, it examines the section for the name of a file
1618
  containing auxiliary debugging information.  It then searches the
1619
  filesystem for this file in a set of standard locations, including
1620
  the directory tree rooted at @var{dir}, and if found returns the
1621
  full filename.
1622
1623
  If @var{dir} is NULL, the search will take place starting at
1624
  the current directory.
1625
1626
  Returns <<NULL>> on any errors or failure to locate the debug
1627
  file, otherwise a pointer to a heap-allocated string
1628
  containing the filename.  The caller is responsible for
1629
  freeing this string.
1630
*/
1631
1632
char *
1633
bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir)
1634
0
{
1635
0
  return find_separate_debug_file (abfd, dir, true,
1636
0
           get_alt_debug_link_info_shim,
1637
0
           separate_alt_debug_file_exists,
1638
0
           NULL);
1639
0
}
1640
1641
/*
1642
FUNCTION
1643
  bfd_create_gnu_debuglink_section
1644
1645
SYNOPSIS
1646
  struct bfd_section *bfd_create_gnu_debuglink_section
1647
    (bfd *abfd, const char *filename);
1648
1649
DESCRIPTION
1650
  Takes a @var{BFD} and adds a .gnu_debuglink section to it.  The
1651
  section is sized to be big enough to contain a link to the specified
1652
  @var{filename}.
1653
1654
  A pointer to the new section is returned if all is ok.  Otherwise
1655
  <<NULL>> is returned and bfd_error is set.
1656
*/
1657
1658
asection *
1659
bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
1660
0
{
1661
0
  asection *sect;
1662
0
  bfd_size_type debuglink_size;
1663
0
  flagword flags;
1664
1665
0
  if (abfd == NULL || filename == NULL)
1666
0
    {
1667
0
      bfd_set_error (bfd_error_invalid_operation);
1668
0
      return NULL;
1669
0
    }
1670
1671
  /* Strip off any path components in filename.  */
1672
0
  filename = lbasename (filename);
1673
1674
0
  sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1675
0
  if (sect)
1676
0
    {
1677
      /* Section already exists.  */
1678
0
      bfd_set_error (bfd_error_invalid_operation);
1679
0
      return NULL;
1680
0
    }
1681
1682
0
  flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
1683
0
  sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
1684
0
  if (sect == NULL)
1685
0
    return NULL;
1686
1687
  /* Compute the size of the section.  Allow for the CRC after the filename,
1688
     and padding so that it will start on a 4-byte boundary.  */
1689
0
  debuglink_size = strlen (filename) + 1;
1690
0
  debuglink_size += 3;
1691
0
  debuglink_size &= ~3;
1692
0
  debuglink_size += 4;
1693
1694
0
  if (!bfd_set_section_size (sect, debuglink_size))
1695
    /* XXX Should we delete the section from the bfd ?  */
1696
0
    return NULL;
1697
1698
  /* PR 21193: Ensure that the section has 4-byte alignment for the CRC.
1699
     Note - despite the name of the function being called, we are
1700
     setting an alignment power, not a byte alignment value.  */
1701
0
  bfd_set_section_alignment (sect, 2);
1702
1703
0
  return sect;
1704
0
}
1705
1706
1707
/*
1708
FUNCTION
1709
  bfd_fill_in_gnu_debuglink_section
1710
1711
SYNOPSIS
1712
  bool bfd_fill_in_gnu_debuglink_section
1713
    (bfd *abfd, struct bfd_section *sect, const char *filename);
1714
1715
DESCRIPTION
1716
  Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
1717
  and fills in the contents of the section to contain a link to the
1718
  specified @var{filename}.  The filename should be absolute or
1719
  relative to the current directory.
1720
1721
  <<TRUE>> is returned if all is ok.  Otherwise <<FALSE>> is returned
1722
  and bfd_error is set.
1723
*/
1724
1725
bool
1726
bfd_fill_in_gnu_debuglink_section (bfd *abfd,
1727
           struct bfd_section *sect,
1728
           const char *filename)
1729
0
{
1730
0
  bfd_size_type debuglink_size;
1731
0
  uint32_t crc32;
1732
0
  char * contents;
1733
0
  bfd_size_type crc_offset;
1734
0
  FILE * handle;
1735
0
  unsigned char buffer[8 * 1024];
1736
0
  size_t count;
1737
0
  size_t filelen;
1738
1739
0
  if (abfd == NULL || sect == NULL || filename == NULL)
1740
0
    {
1741
0
      bfd_set_error (bfd_error_invalid_operation);
1742
0
      return false;
1743
0
    }
1744
1745
  /* Open the linked file so that we can compute a CRC.  */
1746
0
  handle = _bfd_real_fopen (filename, FOPEN_RB);
1747
0
  if (handle == NULL)
1748
0
    {
1749
0
      bfd_set_error (bfd_error_system_call);
1750
0
      return false;
1751
0
    }
1752
1753
0
  crc32 = 0;
1754
0
  while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
1755
0
    crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
1756
0
  fclose (handle);
1757
1758
  /* Strip off any path components in filename,
1759
     now that we no longer need them.  */
1760
0
  filename = lbasename (filename);
1761
1762
0
  filelen = strlen (filename);
1763
0
  debuglink_size = filelen + 1;
1764
0
  debuglink_size += 3;
1765
0
  debuglink_size &= ~3;
1766
0
  debuglink_size += 4;
1767
1768
0
  contents = bfd_malloc (debuglink_size);
1769
0
  if (contents == NULL)
1770
0
    {
1771
      /* XXX Should we delete the section from the bfd ?  */
1772
0
      return false;
1773
0
    }
1774
1775
0
  crc_offset = debuglink_size - 4;
1776
0
  memcpy (contents, filename, filelen);
1777
0
  memset (contents + filelen, 0, crc_offset - filelen);
1778
1779
0
  bfd_put_32 (abfd, crc32, contents + crc_offset);
1780
1781
0
  bool ret = bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size);
1782
0
  free (contents);
1783
0
  return ret;
1784
0
}
1785
1786
/* Finds the build-id associated with @var{abfd}.  If the build-id is
1787
   extracted from the note section then a build-id structure is built
1788
   for it, using memory allocated to @var{abfd}, and this is then
1789
   attached to the @var{abfd}.
1790
1791
   Returns a pointer to the build-id structure if a build-id could be
1792
   found.  If no build-id is found NULL is returned and error code is
1793
   set.  */
1794
1795
static struct bfd_build_id *
1796
get_build_id (bfd *abfd)
1797
4.18k
{
1798
4.18k
  struct bfd_build_id *build_id;
1799
4.18k
  Elf_Internal_Note inote;
1800
4.18k
  Elf_External_Note *enote;
1801
4.18k
  bfd_byte *contents;
1802
4.18k
  asection *sect;
1803
4.18k
  bfd_size_type size;
1804
1805
4.18k
  BFD_ASSERT (abfd);
1806
1807
4.18k
  if (abfd->build_id && abfd->build_id->size > 0)
1808
    /* Save some time by using the already computed build-id.  */
1809
29
    return (struct bfd_build_id *) abfd->build_id;
1810
1811
4.15k
  sect = bfd_get_section_by_name (abfd, ".note.gnu.build-id");
1812
4.15k
  if (sect == NULL
1813
22
      || (sect->flags & SEC_HAS_CONTENTS) == 0)
1814
4.13k
    {
1815
4.13k
      bfd_set_error (bfd_error_no_debug_section);
1816
4.13k
      return NULL;
1817
4.13k
    }
1818
1819
18
  size = bfd_section_size (sect);
1820
  /* FIXME: Should we support smaller build-id notes ?  */
1821
18
  if (size < 0x24)
1822
1
    {
1823
1
      bfd_set_error (bfd_error_invalid_operation);
1824
1
      return NULL;
1825
1
    }
1826
1827
17
  if (!bfd_malloc_and_get_section (abfd, sect, & contents))
1828
0
    return NULL;
1829
1830
  /* FIXME: Paranoia - allow for compressed build-id sections.
1831
     Maybe we should complain if this size is different from
1832
     the one obtained above...  */
1833
17
  size = bfd_section_size (sect);
1834
17
  if (size < sizeof (Elf_External_Note))
1835
0
    {
1836
0
      bfd_set_error (bfd_error_invalid_operation);
1837
0
      free (contents);
1838
0
      return NULL;
1839
0
    }
1840
1841
17
  enote = (Elf_External_Note *) contents;
1842
17
  inote.type = H_GET_32 (abfd, enote->type);
1843
17
  inote.namesz = H_GET_32 (abfd, enote->namesz);
1844
17
  inote.namedata = enote->name;
1845
17
  inote.descsz = H_GET_32 (abfd, enote->descsz);
1846
17
  inote.descdata = inote.namedata + BFD_ALIGN (inote.namesz, 4);
1847
  /* FIXME: Should we check for extra notes in this section ?  */
1848
1849
17
  if (inote.descsz <= 0
1850
12
      || inote.type != NT_GNU_BUILD_ID
1851
4
      || inote.namesz != 4 /* sizeof "GNU"  */
1852
3
      || !startswith (inote.namedata, "GNU")
1853
2
      || inote.descsz > 0x7ffffffe
1854
2
      || size < (12 + BFD_ALIGN (inote.namesz, 4) + inote.descsz))
1855
16
    {
1856
16
      free (contents);
1857
16
      bfd_set_error (bfd_error_invalid_operation);
1858
16
      return NULL;
1859
16
    }
1860
1861
1
  build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) + inote.descsz);
1862
1
  if (build_id == NULL)
1863
0
    {
1864
0
      free (contents);
1865
0
      return NULL;
1866
0
    }
1867
1868
1
  build_id->size = inote.descsz;
1869
1
  memcpy (build_id->data, inote.descdata, inote.descsz);
1870
1
  abfd->build_id = build_id;
1871
1
  free (contents);
1872
1873
1
  return build_id;
1874
1
}
1875
1876
/* Searches @var{abfd} for a build-id, and then constructs a pathname
1877
   from it.  The path is computed as .build-id/NN/NN+NN.debug where
1878
   NNNN+NN is the build-id value as a hexadecimal string.
1879
1880
   Returns the constructed filename or NULL upon error.  It is the
1881
   caller's responsibility to free the memory used to hold the
1882
   filename.  If a filename is returned then the @var{build_id_out_p}
1883
   parameter (which points to a @code{struct bfd_build_id} pointer) is
1884
   set to a pointer to the build_id structure.  */
1885
1886
static char *
1887
get_build_id_name (bfd *abfd, void *build_id_out_p)
1888
4.18k
{
1889
4.18k
  struct bfd_build_id **build_id_out = build_id_out_p;
1890
4.18k
  struct bfd_build_id *build_id;
1891
4.18k
  char *name;
1892
4.18k
  char *n;
1893
4.18k
  bfd_size_type s;
1894
4.18k
  bfd_byte *d;
1895
1896
4.18k
  if (abfd == NULL || bfd_get_filename (abfd) == NULL || build_id_out == NULL)
1897
0
    {
1898
0
      bfd_set_error (bfd_error_invalid_operation);
1899
0
      return NULL;
1900
0
    }
1901
1902
4.18k
  build_id = get_build_id (abfd);
1903
4.18k
  if (build_id == NULL)
1904
4.15k
    return NULL;
1905
1906
  /* Compute the debug pathname corresponding to the build-id.  */
1907
30
  name = bfd_malloc (strlen (".build-id/") + build_id->size * 2 + 2 + strlen (".debug"));
1908
30
  if (name == NULL)
1909
0
    {
1910
0
      bfd_set_error (bfd_error_no_memory);
1911
0
      return NULL;
1912
0
    }
1913
30
  n = name;
1914
30
  d = build_id->data;
1915
30
  s = build_id->size;
1916
1917
30
  n += sprintf (n, ".build-id/");
1918
30
  n += sprintf (n, "%02x", (unsigned) *d++); s--;
1919
30
  n += sprintf (n, "/");
1920
568
  while (s--)
1921
538
    n += sprintf (n, "%02x", (unsigned) *d++);
1922
30
  n += sprintf (n, ".debug");
1923
1924
30
  *build_id_out = build_id;
1925
30
  return name;
1926
30
}
1927
1928
/* Checks to see if @var{name} is a readable file and if its build-id
1929
   matches @var{buildid}.
1930
1931
   Returns TRUE if the file exists, is readable, and contains a
1932
   build-id which matches the build-id pointed at by @var{build_id_p}
1933
   (which is really a @code{struct bfd_build_id **}).  */
1934
1935
static bool
1936
check_build_id_file (const char *name, void *buildid_p)
1937
150
{
1938
150
  struct bfd_build_id *orig_build_id;
1939
150
  struct bfd_build_id *build_id;
1940
150
  bfd * file;
1941
150
  bool result;
1942
1943
150
  BFD_ASSERT (name);
1944
150
  BFD_ASSERT (buildid_p);
1945
1946
150
  file = bfd_openr (name, NULL);
1947
150
  if (file == NULL)
1948
150
    return false;
1949
1950
  /* If the file is an archive, process all of its elements.  */
1951
0
  if (! bfd_check_format (file, bfd_object))
1952
0
    {
1953
0
      bfd_close (file);
1954
0
      return false;
1955
0
    }
1956
1957
0
  build_id = get_build_id (file);
1958
0
  if (build_id == NULL)
1959
0
    {
1960
0
      bfd_close (file);
1961
0
      return false;
1962
0
    }
1963
1964
0
  orig_build_id = *(struct bfd_build_id **) buildid_p;
1965
1966
0
  result = build_id->size == orig_build_id->size
1967
0
    && memcmp (build_id->data, orig_build_id->data, build_id->size) == 0;
1968
1969
0
  (void) bfd_close (file);
1970
1971
0
  return result;
1972
0
}
1973
1974
/*
1975
FUNCTION
1976
  bfd_follow_build_id_debuglink
1977
1978
SYNOPSIS
1979
  char *bfd_follow_build_id_debuglink (bfd *abfd, const char *dir);
1980
1981
DESCRIPTION
1982
  Takes @var{abfd} and searches it for a .note.gnu.build-id section.
1983
  If this section is found, it extracts the value of the NT_GNU_BUILD_ID
1984
  note, which should be a hexadecimal value @var{NNNN+NN} (for
1985
  32+ hex digits).  It then searches the filesystem for a file named
1986
  @var{.build-id/NN/NN+NN.debug} in a set of standard locations,
1987
  including the directory tree rooted at @var{dir}.  The filename
1988
  of the first matching file to be found is returned.  A matching
1989
  file should contain a .note.gnu.build-id section with the same
1990
  @var{NNNN+NN} note as @var{abfd}, although this check is currently
1991
  not implemented.
1992
1993
  If @var{dir} is NULL, the search will take place starting at
1994
  the current directory.
1995
1996
  Returns <<NULL>> on any errors or failure to locate the debug
1997
  file, otherwise a pointer to a heap-allocated string
1998
  containing the filename.  The caller is responsible for
1999
  freeing this string.
2000
*/
2001
2002
char *
2003
bfd_follow_build_id_debuglink (bfd *abfd, const char *dir)
2004
4.18k
{
2005
4.18k
  struct bfd_build_id *build_id;
2006
2007
4.18k
  return find_separate_debug_file (abfd, dir, false,
2008
4.18k
           get_build_id_name,
2009
4.18k
           check_build_id_file, &build_id);
2010
4.18k
}
2011
2012
/*
2013
FUNCTION
2014
  bfd_set_filename
2015
2016
SYNOPSIS
2017
  const char *bfd_set_filename (bfd *abfd, const char *filename);
2018
2019
DESCRIPTION
2020
  Set the filename of @var{abfd}, copying the FILENAME parameter to
2021
  bfd_alloc'd memory owned by @var{abfd}.  Returns a pointer the
2022
  newly allocated name, or NULL if the allocation failed.
2023
*/
2024
2025
const char *
2026
bfd_set_filename (bfd *abfd, const char *filename)
2027
11.6M
{
2028
11.6M
  size_t len = strlen (filename) + 1;
2029
11.6M
  char *n = bfd_alloc (abfd, len);
2030
2031
11.6M
  if (n == NULL)
2032
0
    return NULL;
2033
2034
11.6M
  if (abfd->filename != NULL)
2035
0
    {
2036
      /* PR 29389.  If we attempt to rename a file that has been closed due
2037
   to caching, then we will not be able to reopen it later on.  */
2038
0
      if (abfd->iostream == NULL && (abfd->flags & BFD_CLOSED_BY_CACHE))
2039
0
  {
2040
0
    bfd_set_error (bfd_error_invalid_operation);
2041
0
    return NULL;
2042
0
  }
2043
2044
      /* Similarly if we attempt to close a renamed file because the
2045
   cache is now full, we will not be able to reopen it later on.  */
2046
0
      if (abfd->iostream != NULL)
2047
0
  abfd->cacheable = 0;
2048
0
    }
2049
2050
11.6M
  memcpy (n, filename, len);
2051
11.6M
  abfd->filename = n;
2052
2053
11.6M
  return n;
2054
11.6M
}
2055
2056
/*
2057
FUNCTION
2058
  bfd_extract_object_only_section
2059
2060
SYNOPSIS
2061
  const char *bfd_extract_object_only_section
2062
    (bfd *abfd);
2063
2064
DESCRIPTION
2065
2066
  Takes a @var{ABFD} and extract the .gnu_object_only section into
2067
  a temporary file.
2068
2069
RETURNS
2070
  The name of the temporary file is returned if all is ok.
2071
  Otherwise <<NULL>> is returned and bfd_error is set.
2072
*/
2073
2074
const char *
2075
bfd_extract_object_only_section (bfd *abfd)
2076
0
{
2077
0
  asection *sec = abfd->object_only_section;
2078
0
  const char *name;
2079
0
  FILE *file;
2080
0
  bfd_byte *memhunk = NULL;
2081
0
  size_t off, size;
2082
0
  bfd_error_type err;
2083
2084
  /* Get a temporary object-only file.  */
2085
0
  name = make_temp_file (".obj-only.o");
2086
2087
  /* Open the object-only file.  */
2088
0
  file = _bfd_real_fopen (name, FOPEN_WB);
2089
0
  if (!bfd_get_full_section_contents (abfd, sec, &memhunk))
2090
0
    {
2091
0
      err = bfd_get_error ();
2092
2093
0
loser:
2094
0
      free (memhunk);
2095
0
      fclose (file);
2096
0
      unlink (name);
2097
0
      bfd_set_error (err);
2098
0
      return NULL;
2099
0
    }
2100
2101
0
  off = 0;
2102
0
  size = sec->size;
2103
0
  while (off != size)
2104
0
    {
2105
0
      size_t written, nwrite = size - off;
2106
2107
0
      written = fwrite (memhunk + off, 1, nwrite, file);
2108
0
      if (written < nwrite && ferror (file))
2109
0
  {
2110
0
    err = bfd_error_system_call;
2111
0
    goto loser;
2112
0
  }
2113
2114
0
      off += written;
2115
0
    }
2116
2117
0
  free (memhunk);
2118
0
  fclose (file);
2119
0
  return name;
2120
0
}