gdb/configure: Add --with-libgmp-prefix option
[binutils-gdb.git] / gdb / gdb_bfd.c
bloba61656a6ffe2e5df11a45f039f2e936f84e458b1
1 /* Definitions for BFD wrappers used by GDB.
3 Copyright (C) 2011-2020 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "defs.h"
21 #include "gdb_bfd.h"
22 #include "ui-out.h"
23 #include "gdbcmd.h"
24 #include "hashtab.h"
25 #include "gdbsupport/filestuff.h"
26 #ifdef HAVE_MMAP
27 #include <sys/mman.h>
28 #ifndef MAP_FAILED
29 #define MAP_FAILED ((void *) -1)
30 #endif
31 #endif
32 #include "target.h"
33 #include "gdb/fileio.h"
34 #include "inferior.h"
36 /* An object of this type is stored in the section's user data when
37 mapping a section. */
39 struct gdb_bfd_section_data
41 /* Size of the data. */
42 bfd_size_type size;
43 /* If the data was mmapped, this is the length of the map. */
44 bfd_size_type map_len;
45 /* The data. If NULL, the section data has not been read. */
46 void *data;
47 /* If the data was mmapped, this is the map address. */
48 void *map_addr;
51 /* A hash table holding every BFD that gdb knows about. This is not
52 to be confused with 'gdb_bfd_cache', which is used for sharing
53 BFDs; in contrast, this hash is used just to implement
54 "maint info bfd". */
56 static htab_t all_bfds;
58 /* An object of this type is stored in each BFD's user data. */
60 struct gdb_bfd_data
62 /* Note that if ST is nullptr, then we simply fill in zeroes. */
63 gdb_bfd_data (bfd *abfd, struct stat *st)
64 : mtime (st == nullptr ? 0 : st->st_mtime),
65 size (st == nullptr ? 0 : st->st_size),
66 inode (st == nullptr ? 0 : st->st_ino),
67 device_id (st == nullptr ? 0 : st->st_dev),
68 relocation_computed (0),
69 needs_relocations (0),
70 crc_computed (0)
74 ~gdb_bfd_data ()
78 /* The reference count. */
79 int refc = 1;
81 /* The mtime of the BFD at the point the cache entry was made. */
82 time_t mtime;
84 /* The file size (in bytes) at the point the cache entry was made. */
85 off_t size;
87 /* The inode of the file at the point the cache entry was made. */
88 ino_t inode;
90 /* The device id of the file at the point the cache entry was made. */
91 dev_t device_id;
93 /* This is true if we have determined whether this BFD has any
94 sections requiring relocation. */
95 unsigned int relocation_computed : 1;
97 /* This is true if any section needs relocation. */
98 unsigned int needs_relocations : 1;
100 /* This is true if we have successfully computed the file's CRC. */
101 unsigned int crc_computed : 1;
103 /* The file's CRC. */
104 unsigned long crc = 0;
106 /* If the BFD comes from an archive, this points to the archive's
107 BFD. Otherwise, this is NULL. */
108 bfd *archive_bfd = nullptr;
110 /* Table of all the bfds this bfd has included. */
111 std::vector<gdb_bfd_ref_ptr> included_bfds;
113 /* The registry. */
114 REGISTRY_FIELDS = {};
117 #define GDB_BFD_DATA_ACCESSOR(ABFD) \
118 ((struct gdb_bfd_data *) bfd_usrdata (ABFD))
120 DEFINE_REGISTRY (bfd, GDB_BFD_DATA_ACCESSOR)
122 /* A hash table storing all the BFDs maintained in the cache. */
124 static htab_t gdb_bfd_cache;
126 /* When true gdb will reuse an existing bfd object if the filename,
127 modification time, and file size all match. */
129 static bool bfd_sharing = true;
130 static void
131 show_bfd_sharing (struct ui_file *file, int from_tty,
132 struct cmd_list_element *c, const char *value)
134 fprintf_filtered (file, _("BFD sharing is %s.\n"), value);
137 /* When non-zero debugging of the bfd caches is enabled. */
139 static unsigned int debug_bfd_cache;
140 static void
141 show_bfd_cache_debug (struct ui_file *file, int from_tty,
142 struct cmd_list_element *c, const char *value)
144 fprintf_filtered (file, _("BFD cache debugging is %s.\n"), value);
147 /* The type of an object being looked up in gdb_bfd_cache. We use
148 htab's capability of storing one kind of object (BFD in this case)
149 and using a different sort of object for searching. */
151 struct gdb_bfd_cache_search
153 /* The filename. */
154 const char *filename;
155 /* The mtime. */
156 time_t mtime;
157 /* The file size (in bytes). */
158 off_t size;
159 /* The inode of the file. */
160 ino_t inode;
161 /* The device id of the file. */
162 dev_t device_id;
165 /* A hash function for BFDs. */
167 static hashval_t
168 hash_bfd (const void *b)
170 const bfd *abfd = (const struct bfd *) b;
172 /* It is simplest to just hash the filename. */
173 return htab_hash_string (bfd_get_filename (abfd));
176 /* An equality function for BFDs. Note that this expects the caller
177 to search using struct gdb_bfd_cache_search only, not BFDs. */
179 static int
180 eq_bfd (const void *a, const void *b)
182 const bfd *abfd = (const struct bfd *) a;
183 const struct gdb_bfd_cache_search *s
184 = (const struct gdb_bfd_cache_search *) b;
185 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
187 return (gdata->mtime == s->mtime
188 && gdata->size == s->size
189 && gdata->inode == s->inode
190 && gdata->device_id == s->device_id
191 && strcmp (bfd_get_filename (abfd), s->filename) == 0);
194 /* See gdb_bfd.h. */
197 is_target_filename (const char *name)
199 return startswith (name, TARGET_SYSROOT_PREFIX);
202 /* See gdb_bfd.h. */
205 gdb_bfd_has_target_filename (struct bfd *abfd)
207 return is_target_filename (bfd_get_filename (abfd));
211 /* Return the system error number corresponding to ERRNUM. */
213 static int
214 fileio_errno_to_host (int errnum)
216 switch (errnum)
218 case FILEIO_EPERM:
219 return EPERM;
220 case FILEIO_ENOENT:
221 return ENOENT;
222 case FILEIO_EINTR:
223 return EINTR;
224 case FILEIO_EIO:
225 return EIO;
226 case FILEIO_EBADF:
227 return EBADF;
228 case FILEIO_EACCES:
229 return EACCES;
230 case FILEIO_EFAULT:
231 return EFAULT;
232 case FILEIO_EBUSY:
233 return EBUSY;
234 case FILEIO_EEXIST:
235 return EEXIST;
236 case FILEIO_ENODEV:
237 return ENODEV;
238 case FILEIO_ENOTDIR:
239 return ENOTDIR;
240 case FILEIO_EISDIR:
241 return EISDIR;
242 case FILEIO_EINVAL:
243 return EINVAL;
244 case FILEIO_ENFILE:
245 return ENFILE;
246 case FILEIO_EMFILE:
247 return EMFILE;
248 case FILEIO_EFBIG:
249 return EFBIG;
250 case FILEIO_ENOSPC:
251 return ENOSPC;
252 case FILEIO_ESPIPE:
253 return ESPIPE;
254 case FILEIO_EROFS:
255 return EROFS;
256 case FILEIO_ENOSYS:
257 return ENOSYS;
258 case FILEIO_ENAMETOOLONG:
259 return ENAMETOOLONG;
261 return -1;
264 /* bfd_openr_iovec OPEN_CLOSURE data for gdb_bfd_open. */
265 struct gdb_bfd_open_closure
267 inferior *inf;
268 bool warn_if_slow;
271 /* Wrapper for target_fileio_open suitable for passing as the
272 OPEN_FUNC argument to gdb_bfd_openr_iovec. */
274 static void *
275 gdb_bfd_iovec_fileio_open (struct bfd *abfd, void *open_closure)
277 const char *filename = bfd_get_filename (abfd);
278 int fd, target_errno;
279 int *stream;
280 gdb_bfd_open_closure *oclosure = (gdb_bfd_open_closure *) open_closure;
282 gdb_assert (is_target_filename (filename));
284 fd = target_fileio_open (oclosure->inf,
285 filename + strlen (TARGET_SYSROOT_PREFIX),
286 FILEIO_O_RDONLY, 0, oclosure->warn_if_slow,
287 &target_errno);
288 if (fd == -1)
290 errno = fileio_errno_to_host (target_errno);
291 bfd_set_error (bfd_error_system_call);
292 return NULL;
295 stream = XCNEW (int);
296 *stream = fd;
297 return stream;
300 /* Wrapper for target_fileio_pread suitable for passing as the
301 PREAD_FUNC argument to gdb_bfd_openr_iovec. */
303 static file_ptr
304 gdb_bfd_iovec_fileio_pread (struct bfd *abfd, void *stream, void *buf,
305 file_ptr nbytes, file_ptr offset)
307 int fd = *(int *) stream;
308 int target_errno;
309 file_ptr pos, bytes;
311 pos = 0;
312 while (nbytes > pos)
314 QUIT;
316 bytes = target_fileio_pread (fd, (gdb_byte *) buf + pos,
317 nbytes - pos, offset + pos,
318 &target_errno);
319 if (bytes == 0)
320 /* Success, but no bytes, means end-of-file. */
321 break;
322 if (bytes == -1)
324 errno = fileio_errno_to_host (target_errno);
325 bfd_set_error (bfd_error_system_call);
326 return -1;
329 pos += bytes;
332 return pos;
335 /* Wrapper for target_fileio_close suitable for passing as the
336 CLOSE_FUNC argument to gdb_bfd_openr_iovec. */
338 static int
339 gdb_bfd_iovec_fileio_close (struct bfd *abfd, void *stream)
341 int fd = *(int *) stream;
342 int target_errno;
344 xfree (stream);
346 /* Ignore errors on close. These may happen with remote
347 targets if the connection has already been torn down. */
348 target_fileio_close (fd, &target_errno);
350 /* Zero means success. */
351 return 0;
354 /* Wrapper for target_fileio_fstat suitable for passing as the
355 STAT_FUNC argument to gdb_bfd_openr_iovec. */
357 static int
358 gdb_bfd_iovec_fileio_fstat (struct bfd *abfd, void *stream,
359 struct stat *sb)
361 int fd = *(int *) stream;
362 int target_errno;
363 int result;
365 result = target_fileio_fstat (fd, sb, &target_errno);
366 if (result == -1)
368 errno = fileio_errno_to_host (target_errno);
369 bfd_set_error (bfd_error_system_call);
372 return result;
375 /* A helper function to initialize the data that gdb attaches to each
376 BFD. */
378 static void
379 gdb_bfd_init_data (struct bfd *abfd, struct stat *st)
381 struct gdb_bfd_data *gdata;
382 void **slot;
384 gdb_assert (bfd_usrdata (abfd) == nullptr);
386 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
387 abfd->flags |= BFD_DECOMPRESS;
389 gdata = new gdb_bfd_data (abfd, st);
390 bfd_set_usrdata (abfd, gdata);
391 bfd_alloc_data (abfd);
393 /* This is the first we've seen it, so add it to the hash table. */
394 slot = htab_find_slot (all_bfds, abfd, INSERT);
395 gdb_assert (slot && !*slot);
396 *slot = abfd;
399 /* See gdb_bfd.h. */
401 gdb_bfd_ref_ptr
402 gdb_bfd_open (const char *name, const char *target, int fd,
403 bool warn_if_slow)
405 hashval_t hash;
406 void **slot;
407 bfd *abfd;
408 struct gdb_bfd_cache_search search;
409 struct stat st;
411 if (is_target_filename (name))
413 if (!target_filesystem_is_local ())
415 gdb_assert (fd == -1);
417 gdb_bfd_open_closure open_closure { current_inferior (), warn_if_slow };
418 return gdb_bfd_openr_iovec (name, target,
419 gdb_bfd_iovec_fileio_open,
420 &open_closure,
421 gdb_bfd_iovec_fileio_pread,
422 gdb_bfd_iovec_fileio_close,
423 gdb_bfd_iovec_fileio_fstat);
426 name += strlen (TARGET_SYSROOT_PREFIX);
429 if (gdb_bfd_cache == NULL)
430 gdb_bfd_cache = htab_create_alloc (1, hash_bfd, eq_bfd, NULL,
431 xcalloc, xfree);
433 if (fd == -1)
435 fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0);
436 if (fd == -1)
438 bfd_set_error (bfd_error_system_call);
439 return NULL;
443 if (fstat (fd, &st) < 0)
445 /* Weird situation here -- don't cache if we can't stat. */
446 if (debug_bfd_cache)
447 fprintf_unfiltered (gdb_stdlog,
448 "Could not stat %s - not caching\n",
449 name);
450 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
451 if (abfd == nullptr)
452 return nullptr;
453 return gdb_bfd_ref_ptr::new_reference (abfd);
456 search.filename = name;
457 search.mtime = st.st_mtime;
458 search.size = st.st_size;
459 search.inode = st.st_ino;
460 search.device_id = st.st_dev;
462 /* Note that this must compute the same result as hash_bfd. */
463 hash = htab_hash_string (name);
464 /* Note that we cannot use htab_find_slot_with_hash here, because
465 opening the BFD may fail; and this would violate hashtab
466 invariants. */
467 abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
468 if (bfd_sharing && abfd != NULL)
470 if (debug_bfd_cache)
471 fprintf_unfiltered (gdb_stdlog,
472 "Reusing cached bfd %s for %s\n",
473 host_address_to_string (abfd),
474 bfd_get_filename (abfd));
475 close (fd);
476 return gdb_bfd_ref_ptr::new_reference (abfd);
479 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
480 if (abfd == NULL)
481 return NULL;
483 if (debug_bfd_cache)
484 fprintf_unfiltered (gdb_stdlog,
485 "Creating new bfd %s for %s\n",
486 host_address_to_string (abfd),
487 bfd_get_filename (abfd));
489 if (bfd_sharing)
491 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
492 gdb_assert (!*slot);
493 *slot = abfd;
496 /* It's important to pass the already-computed stat info here,
497 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
498 default will "stat" the file each time bfd_get_mtime is called --
499 and since we already entered it into the hash table using this
500 mtime, if the file changed at the wrong moment, the race would
501 lead to a hash table corruption. */
502 gdb_bfd_init_data (abfd, &st);
503 return gdb_bfd_ref_ptr (abfd);
506 /* A helper function that releases any section data attached to the
507 BFD. */
509 static void
510 free_one_bfd_section (asection *sectp)
512 struct gdb_bfd_section_data *sect
513 = (struct gdb_bfd_section_data *) bfd_section_userdata (sectp);
515 if (sect != NULL && sect->data != NULL)
517 #ifdef HAVE_MMAP
518 if (sect->map_addr != NULL)
520 int res;
522 res = munmap (sect->map_addr, sect->map_len);
523 gdb_assert (res == 0);
525 else
526 #endif
527 xfree (sect->data);
531 /* Close ABFD, and warn if that fails. */
533 static int
534 gdb_bfd_close_or_warn (struct bfd *abfd)
536 int ret;
537 const char *name = bfd_get_filename (abfd);
539 for (asection *sect : gdb_bfd_sections (abfd))
540 free_one_bfd_section (sect);
542 ret = bfd_close (abfd);
544 if (!ret)
545 warning (_("cannot close \"%s\": %s"),
546 name, bfd_errmsg (bfd_get_error ()));
548 return ret;
551 /* See gdb_bfd.h. */
553 void
554 gdb_bfd_ref (struct bfd *abfd)
556 struct gdb_bfd_data *gdata;
558 if (abfd == NULL)
559 return;
561 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
563 if (debug_bfd_cache)
564 fprintf_unfiltered (gdb_stdlog,
565 "Increase reference count on bfd %s (%s)\n",
566 host_address_to_string (abfd),
567 bfd_get_filename (abfd));
569 if (gdata != NULL)
571 gdata->refc += 1;
572 return;
575 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
576 fine. */
577 gdb_bfd_init_data (abfd, nullptr);
580 /* See gdb_bfd.h. */
582 void
583 gdb_bfd_unref (struct bfd *abfd)
585 struct gdb_bfd_data *gdata;
586 struct gdb_bfd_cache_search search;
587 bfd *archive_bfd;
589 if (abfd == NULL)
590 return;
592 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
593 gdb_assert (gdata->refc >= 1);
595 gdata->refc -= 1;
596 if (gdata->refc > 0)
598 if (debug_bfd_cache)
599 fprintf_unfiltered (gdb_stdlog,
600 "Decrease reference count on bfd %s (%s)\n",
601 host_address_to_string (abfd),
602 bfd_get_filename (abfd));
603 return;
606 if (debug_bfd_cache)
607 fprintf_unfiltered (gdb_stdlog,
608 "Delete final reference count on bfd %s (%s)\n",
609 host_address_to_string (abfd),
610 bfd_get_filename (abfd));
612 archive_bfd = gdata->archive_bfd;
613 search.filename = bfd_get_filename (abfd);
615 if (gdb_bfd_cache && search.filename)
617 hashval_t hash = htab_hash_string (search.filename);
618 void **slot;
620 search.mtime = gdata->mtime;
621 search.size = gdata->size;
622 search.inode = gdata->inode;
623 search.device_id = gdata->device_id;
624 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash,
625 NO_INSERT);
627 if (slot && *slot)
628 htab_clear_slot (gdb_bfd_cache, slot);
631 bfd_free_data (abfd);
632 delete gdata;
633 bfd_set_usrdata (abfd, NULL); /* Paranoia. */
635 htab_remove_elt (all_bfds, abfd);
637 gdb_bfd_close_or_warn (abfd);
639 gdb_bfd_unref (archive_bfd);
642 /* A helper function that returns the section data descriptor
643 associated with SECTION. If no such descriptor exists, a new one
644 is allocated and cleared. */
646 static struct gdb_bfd_section_data *
647 get_section_descriptor (asection *section)
649 struct gdb_bfd_section_data *result;
651 result = (struct gdb_bfd_section_data *) bfd_section_userdata (section);
653 if (result == NULL)
655 result = ((struct gdb_bfd_section_data *)
656 bfd_zalloc (section->owner, sizeof (*result)));
657 bfd_set_section_userdata (section, result);
660 return result;
663 /* See gdb_bfd.h. */
665 const gdb_byte *
666 gdb_bfd_map_section (asection *sectp, bfd_size_type *size)
668 bfd *abfd;
669 struct gdb_bfd_section_data *descriptor;
670 bfd_byte *data;
672 gdb_assert ((sectp->flags & SEC_RELOC) == 0);
673 gdb_assert (size != NULL);
675 abfd = sectp->owner;
677 descriptor = get_section_descriptor (sectp);
679 /* If the data was already read for this BFD, just reuse it. */
680 if (descriptor->data != NULL)
681 goto done;
683 #ifdef HAVE_MMAP
684 if (!bfd_is_section_compressed (abfd, sectp))
686 /* The page size, used when mmapping. */
687 static int pagesize;
689 if (pagesize == 0)
690 pagesize = getpagesize ();
692 /* Only try to mmap sections which are large enough: we don't want
693 to waste space due to fragmentation. */
695 if (bfd_section_size (sectp) > 4 * pagesize)
697 descriptor->size = bfd_section_size (sectp);
698 descriptor->data = bfd_mmap (abfd, 0, descriptor->size, PROT_READ,
699 MAP_PRIVATE, sectp->filepos,
700 &descriptor->map_addr,
701 &descriptor->map_len);
703 if ((caddr_t)descriptor->data != MAP_FAILED)
705 #if HAVE_POSIX_MADVISE
706 posix_madvise (descriptor->map_addr, descriptor->map_len,
707 POSIX_MADV_WILLNEED);
708 #endif
709 goto done;
712 /* On failure, clear out the section data and try again. */
713 memset (descriptor, 0, sizeof (*descriptor));
716 #endif /* HAVE_MMAP */
718 /* Handle compressed sections, or ordinary uncompressed sections in
719 the no-mmap case. */
721 descriptor->size = bfd_section_size (sectp);
722 descriptor->data = NULL;
724 data = NULL;
725 if (!bfd_get_full_section_contents (abfd, sectp, &data))
727 warning (_("Can't read data for section '%s' in file '%s'"),
728 bfd_section_name (sectp),
729 bfd_get_filename (abfd));
730 /* Set size to 0 to prevent further attempts to read the invalid
731 section. */
732 *size = 0;
733 return NULL;
735 descriptor->data = data;
737 done:
738 gdb_assert (descriptor->data != NULL);
739 *size = descriptor->size;
740 return (const gdb_byte *) descriptor->data;
743 /* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
744 return 1. Otherwise print a warning and return 0. ABFD seek position is
745 not preserved. */
747 static int
748 get_file_crc (bfd *abfd, unsigned long *file_crc_return)
750 unsigned long file_crc = 0;
752 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
754 warning (_("Problem reading \"%s\" for CRC: %s"),
755 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
756 return 0;
759 for (;;)
761 gdb_byte buffer[8 * 1024];
762 bfd_size_type count;
764 count = bfd_bread (buffer, sizeof (buffer), abfd);
765 if (count == (bfd_size_type) -1)
767 warning (_("Problem reading \"%s\" for CRC: %s"),
768 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
769 return 0;
771 if (count == 0)
772 break;
773 file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
776 *file_crc_return = file_crc;
777 return 1;
780 /* See gdb_bfd.h. */
783 gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
785 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
787 if (!gdata->crc_computed)
788 gdata->crc_computed = get_file_crc (abfd, &gdata->crc);
790 if (gdata->crc_computed)
791 *crc_out = gdata->crc;
792 return gdata->crc_computed;
797 /* See gdb_bfd.h. */
799 gdb_bfd_ref_ptr
800 gdb_bfd_fopen (const char *filename, const char *target, const char *mode,
801 int fd)
803 bfd *result = bfd_fopen (filename, target, mode, fd);
805 return gdb_bfd_ref_ptr::new_reference (result);
808 /* See gdb_bfd.h. */
810 gdb_bfd_ref_ptr
811 gdb_bfd_openr (const char *filename, const char *target)
813 bfd *result = bfd_openr (filename, target);
815 return gdb_bfd_ref_ptr::new_reference (result);
818 /* See gdb_bfd.h. */
820 gdb_bfd_ref_ptr
821 gdb_bfd_openw (const char *filename, const char *target)
823 bfd *result = bfd_openw (filename, target);
825 return gdb_bfd_ref_ptr::new_reference (result);
828 /* See gdb_bfd.h. */
830 gdb_bfd_ref_ptr
831 gdb_bfd_openr_iovec (const char *filename, const char *target,
832 void *(*open_func) (struct bfd *nbfd,
833 void *open_closure),
834 void *open_closure,
835 file_ptr (*pread_func) (struct bfd *nbfd,
836 void *stream,
837 void *buf,
838 file_ptr nbytes,
839 file_ptr offset),
840 int (*close_func) (struct bfd *nbfd,
841 void *stream),
842 int (*stat_func) (struct bfd *abfd,
843 void *stream,
844 struct stat *sb))
846 bfd *result = bfd_openr_iovec (filename, target,
847 open_func, open_closure,
848 pread_func, close_func, stat_func);
850 return gdb_bfd_ref_ptr::new_reference (result);
853 /* See gdb_bfd.h. */
855 void
856 gdb_bfd_mark_parent (bfd *child, bfd *parent)
858 struct gdb_bfd_data *gdata;
860 gdb_bfd_ref (child);
861 /* No need to stash the filename here, because we also keep a
862 reference on the parent archive. */
864 gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
865 if (gdata->archive_bfd == NULL)
867 gdata->archive_bfd = parent;
868 gdb_bfd_ref (parent);
870 else
871 gdb_assert (gdata->archive_bfd == parent);
874 /* See gdb_bfd.h. */
876 gdb_bfd_ref_ptr
877 gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
879 bfd *result = bfd_openr_next_archived_file (archive, previous);
881 if (result)
882 gdb_bfd_mark_parent (result, archive);
884 return gdb_bfd_ref_ptr (result);
887 /* See gdb_bfd.h. */
889 void
890 gdb_bfd_record_inclusion (bfd *includer, bfd *includee)
892 struct gdb_bfd_data *gdata;
894 gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
895 gdata->included_bfds.push_back (gdb_bfd_ref_ptr::new_reference (includee));
900 gdb_static_assert (ARRAY_SIZE (_bfd_std_section) == 4);
902 /* See gdb_bfd.h. */
905 gdb_bfd_section_index (bfd *abfd, asection *section)
907 if (section == NULL)
908 return -1;
909 else if (section == bfd_com_section_ptr)
910 return bfd_count_sections (abfd);
911 else if (section == bfd_und_section_ptr)
912 return bfd_count_sections (abfd) + 1;
913 else if (section == bfd_abs_section_ptr)
914 return bfd_count_sections (abfd) + 2;
915 else if (section == bfd_ind_section_ptr)
916 return bfd_count_sections (abfd) + 3;
917 return section->index;
920 /* See gdb_bfd.h. */
923 gdb_bfd_count_sections (bfd *abfd)
925 return bfd_count_sections (abfd) + 4;
928 /* See gdb_bfd.h. */
931 gdb_bfd_requires_relocations (bfd *abfd)
933 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
935 if (gdata->relocation_computed == 0)
937 asection *sect;
939 for (sect = abfd->sections; sect != NULL; sect = sect->next)
940 if ((sect->flags & SEC_RELOC) != 0)
942 gdata->needs_relocations = 1;
943 break;
946 gdata->relocation_computed = 1;
949 return gdata->needs_relocations;
952 /* See gdb_bfd.h. */
954 bool
955 gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
956 gdb::byte_vector *contents)
958 bfd_size_type section_size = bfd_section_size (section);
960 contents->resize (section_size);
962 return bfd_get_section_contents (abfd, section, contents->data (), 0,
963 section_size);
966 /* A callback for htab_traverse that prints a single BFD. */
968 static int
969 print_one_bfd (void **slot, void *data)
971 bfd *abfd = (struct bfd *) *slot;
972 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
973 struct ui_out *uiout = (struct ui_out *) data;
975 ui_out_emit_tuple tuple_emitter (uiout, NULL);
976 uiout->field_signed ("refcount", gdata->refc);
977 uiout->field_string ("addr", host_address_to_string (abfd));
978 uiout->field_string ("filename", bfd_get_filename (abfd));
979 uiout->text ("\n");
981 return 1;
984 /* Implement the 'maint info bfd' command. */
986 static void
987 maintenance_info_bfds (const char *arg, int from_tty)
989 struct ui_out *uiout = current_uiout;
991 ui_out_emit_table table_emitter (uiout, 3, -1, "bfds");
992 uiout->table_header (10, ui_left, "refcount", "Refcount");
993 uiout->table_header (18, ui_left, "addr", "Address");
994 uiout->table_header (40, ui_left, "filename", "Filename");
996 uiout->table_body ();
997 htab_traverse (all_bfds, print_one_bfd, uiout);
1000 void _initialize_gdb_bfd ();
1001 void
1002 _initialize_gdb_bfd ()
1004 all_bfds = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
1005 NULL, xcalloc, xfree);
1007 add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
1008 List the BFDs that are currently open."),
1009 &maintenanceinfolist);
1011 add_setshow_boolean_cmd ("bfd-sharing", no_class,
1012 &bfd_sharing, _("\
1013 Set whether gdb will share bfds that appear to be the same file."), _("\
1014 Show whether gdb will share bfds that appear to be the same file."), _("\
1015 When enabled gdb will reuse existing bfds rather than reopening the\n\
1016 same file. To decide if two files are the same then gdb compares the\n\
1017 filename, file size, file modification time, and file inode."),
1018 NULL,
1019 &show_bfd_sharing,
1020 &maintenance_set_cmdlist,
1021 &maintenance_show_cmdlist);
1023 add_setshow_zuinteger_cmd ("bfd-cache", class_maintenance,
1024 &debug_bfd_cache, _("\
1025 Set bfd cache debugging."), _("\
1026 Show bfd cache debugging."), _("\
1027 When non-zero, bfd cache specific debugging is enabled."),
1028 NULL,
1029 &show_bfd_cache_debug,
1030 &setdebuglist, &showdebuglist);