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