1 /* Definitions for BFD wrappers used by GDB.
3 Copyright (C) 2011-2021 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/>. */
25 #include "gdbsupport/filestuff.h"
29 #define MAP_FAILED ((void *) -1)
33 #include "gdb/fileio.h"
36 /* An object of this type is stored in the section's user data when
39 struct gdb_bfd_section_data
41 /* Size of the data. */
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. */
47 /* If the data was mmapped, this is the map address. */
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
56 static htab_t all_bfds
;
58 /* An object of this type is stored in each BFD's user 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),
78 /* The reference count. */
81 /* The mtime of the BFD at the point the cache entry was made. */
84 /* The file size (in bytes) at the point the cache entry was made. */
87 /* The inode of the file at the point the cache entry was made. */
90 /* The device id of the file at the point the cache entry was made. */
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
;
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;
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
;
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
154 const char *filename
;
157 /* The file size (in bytes). */
159 /* The inode of the file. */
161 /* The device id of the file. */
165 /* A hash function for BFDs. */
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. */
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);
197 is_target_filename (const char *name
)
199 return startswith (name
, TARGET_SYSROOT_PREFIX
);
205 gdb_bfd_has_target_filename (struct bfd
*abfd
)
207 return is_target_filename (bfd_get_filename (abfd
));
210 /* For `gdb_bfd_open_from_target_memory`. */
218 /* For `gdb_bfd_open_from_target_memory`. Opening the file is a no-op. */
221 mem_bfd_iovec_open (struct bfd
*abfd
, void *open_closure
)
226 /* For `gdb_bfd_open_from_target_memory`. Closing the file is just freeing the
227 base/size pair on our side. */
230 mem_bfd_iovec_close (struct bfd
*abfd
, void *stream
)
234 /* Zero means success. */
238 /* For `gdb_bfd_open_from_target_memory`. For reading the file, we just need to
239 pass through to target_read_memory and fix up the arguments and return
243 mem_bfd_iovec_pread (struct bfd
*abfd
, void *stream
, void *buf
,
244 file_ptr nbytes
, file_ptr offset
)
247 struct target_buffer
*buffer
= (struct target_buffer
*) stream
;
249 /* If this read will read all of the file, limit it to just the rest. */
250 if (offset
+ nbytes
> buffer
->size
)
251 nbytes
= buffer
->size
- offset
;
253 /* If there are no more bytes left, we've reached EOF. */
257 err
= target_read_memory (buffer
->base
+ offset
, (gdb_byte
*) buf
, nbytes
);
264 /* For `gdb_bfd_open_from_target_memory`. For statting the file, we only
265 support the st_size attribute. */
268 mem_bfd_iovec_stat (struct bfd
*abfd
, void *stream
, struct stat
*sb
)
270 struct target_buffer
*buffer
= (struct target_buffer
*) stream
;
272 memset (sb
, 0, sizeof (struct stat
));
273 sb
->st_size
= buffer
->size
;
280 gdb_bfd_open_from_target_memory (CORE_ADDR addr
, ULONGEST size
,
282 const char *filename
)
284 struct target_buffer
*buffer
= XNEW (struct target_buffer
);
288 return gdb_bfd_openr_iovec (filename
? filename
: "<in-memory>", target
,
296 /* Return the system error number corresponding to ERRNUM. */
299 fileio_errno_to_host (int errnum
)
343 case FILEIO_ENAMETOOLONG
:
349 /* bfd_openr_iovec OPEN_CLOSURE data for gdb_bfd_open. */
350 struct gdb_bfd_open_closure
356 /* Wrapper for target_fileio_open suitable for passing as the
357 OPEN_FUNC argument to gdb_bfd_openr_iovec. */
360 gdb_bfd_iovec_fileio_open (struct bfd
*abfd
, void *open_closure
)
362 const char *filename
= bfd_get_filename (abfd
);
363 int fd
, target_errno
;
365 gdb_bfd_open_closure
*oclosure
= (gdb_bfd_open_closure
*) open_closure
;
367 gdb_assert (is_target_filename (filename
));
369 fd
= target_fileio_open (oclosure
->inf
,
370 filename
+ strlen (TARGET_SYSROOT_PREFIX
),
371 FILEIO_O_RDONLY
, 0, oclosure
->warn_if_slow
,
375 errno
= fileio_errno_to_host (target_errno
);
376 bfd_set_error (bfd_error_system_call
);
380 stream
= XCNEW (int);
385 /* Wrapper for target_fileio_pread suitable for passing as the
386 PREAD_FUNC argument to gdb_bfd_openr_iovec. */
389 gdb_bfd_iovec_fileio_pread (struct bfd
*abfd
, void *stream
, void *buf
,
390 file_ptr nbytes
, file_ptr offset
)
392 int fd
= *(int *) stream
;
401 bytes
= target_fileio_pread (fd
, (gdb_byte
*) buf
+ pos
,
402 nbytes
- pos
, offset
+ pos
,
405 /* Success, but no bytes, means end-of-file. */
409 errno
= fileio_errno_to_host (target_errno
);
410 bfd_set_error (bfd_error_system_call
);
420 /* Wrapper for target_fileio_close suitable for passing as the
421 CLOSE_FUNC argument to gdb_bfd_openr_iovec. */
424 gdb_bfd_iovec_fileio_close (struct bfd
*abfd
, void *stream
)
426 int fd
= *(int *) stream
;
431 /* Ignore errors on close. These may happen with remote
432 targets if the connection has already been torn down. */
433 target_fileio_close (fd
, &target_errno
);
435 /* Zero means success. */
439 /* Wrapper for target_fileio_fstat suitable for passing as the
440 STAT_FUNC argument to gdb_bfd_openr_iovec. */
443 gdb_bfd_iovec_fileio_fstat (struct bfd
*abfd
, void *stream
,
446 int fd
= *(int *) stream
;
450 result
= target_fileio_fstat (fd
, sb
, &target_errno
);
453 errno
= fileio_errno_to_host (target_errno
);
454 bfd_set_error (bfd_error_system_call
);
460 /* A helper function to initialize the data that gdb attaches to each
464 gdb_bfd_init_data (struct bfd
*abfd
, struct stat
*st
)
466 struct gdb_bfd_data
*gdata
;
469 gdb_assert (bfd_usrdata (abfd
) == nullptr);
471 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
472 abfd
->flags
|= BFD_DECOMPRESS
;
474 gdata
= new gdb_bfd_data (abfd
, st
);
475 bfd_set_usrdata (abfd
, gdata
);
476 bfd_alloc_data (abfd
);
478 /* This is the first we've seen it, so add it to the hash table. */
479 slot
= htab_find_slot (all_bfds
, abfd
, INSERT
);
480 gdb_assert (slot
&& !*slot
);
487 gdb_bfd_open (const char *name
, const char *target
, int fd
,
493 struct gdb_bfd_cache_search search
;
496 if (is_target_filename (name
))
498 if (!target_filesystem_is_local ())
500 gdb_assert (fd
== -1);
502 gdb_bfd_open_closure open_closure
{ current_inferior (), warn_if_slow
};
503 return gdb_bfd_openr_iovec (name
, target
,
504 gdb_bfd_iovec_fileio_open
,
506 gdb_bfd_iovec_fileio_pread
,
507 gdb_bfd_iovec_fileio_close
,
508 gdb_bfd_iovec_fileio_fstat
);
511 name
+= strlen (TARGET_SYSROOT_PREFIX
);
514 if (gdb_bfd_cache
== NULL
)
515 gdb_bfd_cache
= htab_create_alloc (1, hash_bfd
, eq_bfd
, NULL
,
520 fd
= gdb_open_cloexec (name
, O_RDONLY
| O_BINARY
, 0);
523 bfd_set_error (bfd_error_system_call
);
528 if (fstat (fd
, &st
) < 0)
530 /* Weird situation here -- don't cache if we can't stat. */
532 fprintf_unfiltered (gdb_stdlog
,
533 "Could not stat %s - not caching\n",
535 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
538 return gdb_bfd_ref_ptr::new_reference (abfd
);
541 search
.filename
= name
;
542 search
.mtime
= st
.st_mtime
;
543 search
.size
= st
.st_size
;
544 search
.inode
= st
.st_ino
;
545 search
.device_id
= st
.st_dev
;
547 /* Note that this must compute the same result as hash_bfd. */
548 hash
= htab_hash_string (name
);
549 /* Note that we cannot use htab_find_slot_with_hash here, because
550 opening the BFD may fail; and this would violate hashtab
552 abfd
= (struct bfd
*) htab_find_with_hash (gdb_bfd_cache
, &search
, hash
);
553 if (bfd_sharing
&& abfd
!= NULL
)
556 fprintf_unfiltered (gdb_stdlog
,
557 "Reusing cached bfd %s for %s\n",
558 host_address_to_string (abfd
),
559 bfd_get_filename (abfd
));
561 return gdb_bfd_ref_ptr::new_reference (abfd
);
564 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
569 fprintf_unfiltered (gdb_stdlog
,
570 "Creating new bfd %s for %s\n",
571 host_address_to_string (abfd
),
572 bfd_get_filename (abfd
));
576 slot
= htab_find_slot_with_hash (gdb_bfd_cache
, &search
, hash
, INSERT
);
581 /* It's important to pass the already-computed stat info here,
582 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
583 default will "stat" the file each time bfd_get_mtime is called --
584 and since we already entered it into the hash table using this
585 mtime, if the file changed at the wrong moment, the race would
586 lead to a hash table corruption. */
587 gdb_bfd_init_data (abfd
, &st
);
588 return gdb_bfd_ref_ptr (abfd
);
591 /* A helper function that releases any section data attached to the
595 free_one_bfd_section (asection
*sectp
)
597 struct gdb_bfd_section_data
*sect
598 = (struct gdb_bfd_section_data
*) bfd_section_userdata (sectp
);
600 if (sect
!= NULL
&& sect
->data
!= NULL
)
603 if (sect
->map_addr
!= NULL
)
607 res
= munmap (sect
->map_addr
, sect
->map_len
);
608 gdb_assert (res
== 0);
616 /* Close ABFD, and warn if that fails. */
619 gdb_bfd_close_or_warn (struct bfd
*abfd
)
622 const char *name
= bfd_get_filename (abfd
);
624 for (asection
*sect
: gdb_bfd_sections (abfd
))
625 free_one_bfd_section (sect
);
627 ret
= bfd_close (abfd
);
630 warning (_("cannot close \"%s\": %s"),
631 name
, bfd_errmsg (bfd_get_error ()));
639 gdb_bfd_ref (struct bfd
*abfd
)
641 struct gdb_bfd_data
*gdata
;
646 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
649 fprintf_unfiltered (gdb_stdlog
,
650 "Increase reference count on bfd %s (%s)\n",
651 host_address_to_string (abfd
),
652 bfd_get_filename (abfd
));
660 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
662 gdb_bfd_init_data (abfd
, nullptr);
668 gdb_bfd_unref (struct bfd
*abfd
)
670 struct gdb_bfd_data
*gdata
;
671 struct gdb_bfd_cache_search search
;
677 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
678 gdb_assert (gdata
->refc
>= 1);
684 fprintf_unfiltered (gdb_stdlog
,
685 "Decrease reference count on bfd %s (%s)\n",
686 host_address_to_string (abfd
),
687 bfd_get_filename (abfd
));
692 fprintf_unfiltered (gdb_stdlog
,
693 "Delete final reference count on bfd %s (%s)\n",
694 host_address_to_string (abfd
),
695 bfd_get_filename (abfd
));
697 archive_bfd
= gdata
->archive_bfd
;
698 search
.filename
= bfd_get_filename (abfd
);
700 if (gdb_bfd_cache
&& search
.filename
)
702 hashval_t hash
= htab_hash_string (search
.filename
);
705 search
.mtime
= gdata
->mtime
;
706 search
.size
= gdata
->size
;
707 search
.inode
= gdata
->inode
;
708 search
.device_id
= gdata
->device_id
;
709 slot
= htab_find_slot_with_hash (gdb_bfd_cache
, &search
, hash
,
713 htab_clear_slot (gdb_bfd_cache
, slot
);
716 bfd_free_data (abfd
);
718 bfd_set_usrdata (abfd
, NULL
); /* Paranoia. */
720 htab_remove_elt (all_bfds
, abfd
);
722 gdb_bfd_close_or_warn (abfd
);
724 gdb_bfd_unref (archive_bfd
);
727 /* A helper function that returns the section data descriptor
728 associated with SECTION. If no such descriptor exists, a new one
729 is allocated and cleared. */
731 static struct gdb_bfd_section_data
*
732 get_section_descriptor (asection
*section
)
734 struct gdb_bfd_section_data
*result
;
736 result
= (struct gdb_bfd_section_data
*) bfd_section_userdata (section
);
740 result
= ((struct gdb_bfd_section_data
*)
741 bfd_zalloc (section
->owner
, sizeof (*result
)));
742 bfd_set_section_userdata (section
, result
);
751 gdb_bfd_map_section (asection
*sectp
, bfd_size_type
*size
)
754 struct gdb_bfd_section_data
*descriptor
;
757 gdb_assert ((sectp
->flags
& SEC_RELOC
) == 0);
758 gdb_assert (size
!= NULL
);
762 descriptor
= get_section_descriptor (sectp
);
764 /* If the data was already read for this BFD, just reuse it. */
765 if (descriptor
->data
!= NULL
)
769 if (!bfd_is_section_compressed (abfd
, sectp
))
771 /* The page size, used when mmapping. */
775 pagesize
= getpagesize ();
777 /* Only try to mmap sections which are large enough: we don't want
778 to waste space due to fragmentation. */
780 if (bfd_section_size (sectp
) > 4 * pagesize
)
782 descriptor
->size
= bfd_section_size (sectp
);
783 descriptor
->data
= bfd_mmap (abfd
, 0, descriptor
->size
, PROT_READ
,
784 MAP_PRIVATE
, sectp
->filepos
,
785 &descriptor
->map_addr
,
786 &descriptor
->map_len
);
788 if ((caddr_t
)descriptor
->data
!= MAP_FAILED
)
790 #if HAVE_POSIX_MADVISE
791 posix_madvise (descriptor
->map_addr
, descriptor
->map_len
,
792 POSIX_MADV_WILLNEED
);
797 /* On failure, clear out the section data and try again. */
798 memset (descriptor
, 0, sizeof (*descriptor
));
801 #endif /* HAVE_MMAP */
803 /* Handle compressed sections, or ordinary uncompressed sections in
806 descriptor
->size
= bfd_section_size (sectp
);
807 descriptor
->data
= NULL
;
810 if (!bfd_get_full_section_contents (abfd
, sectp
, &data
))
812 warning (_("Can't read data for section '%s' in file '%s'"),
813 bfd_section_name (sectp
),
814 bfd_get_filename (abfd
));
815 /* Set size to 0 to prevent further attempts to read the invalid
820 descriptor
->data
= data
;
823 gdb_assert (descriptor
->data
!= NULL
);
824 *size
= descriptor
->size
;
825 return (const gdb_byte
*) descriptor
->data
;
828 /* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
829 return 1. Otherwise print a warning and return 0. ABFD seek position is
833 get_file_crc (bfd
*abfd
, unsigned long *file_crc_return
)
835 unsigned long file_crc
= 0;
837 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
839 warning (_("Problem reading \"%s\" for CRC: %s"),
840 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
846 gdb_byte buffer
[8 * 1024];
849 count
= bfd_bread (buffer
, sizeof (buffer
), abfd
);
850 if (count
== (bfd_size_type
) -1)
852 warning (_("Problem reading \"%s\" for CRC: %s"),
853 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
858 file_crc
= bfd_calc_gnu_debuglink_crc32 (file_crc
, buffer
, count
);
861 *file_crc_return
= file_crc
;
868 gdb_bfd_crc (struct bfd
*abfd
, unsigned long *crc_out
)
870 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
872 if (!gdata
->crc_computed
)
873 gdata
->crc_computed
= get_file_crc (abfd
, &gdata
->crc
);
875 if (gdata
->crc_computed
)
876 *crc_out
= gdata
->crc
;
877 return gdata
->crc_computed
;
885 gdb_bfd_fopen (const char *filename
, const char *target
, const char *mode
,
888 bfd
*result
= bfd_fopen (filename
, target
, mode
, fd
);
890 return gdb_bfd_ref_ptr::new_reference (result
);
896 gdb_bfd_openr (const char *filename
, const char *target
)
898 bfd
*result
= bfd_openr (filename
, target
);
900 return gdb_bfd_ref_ptr::new_reference (result
);
906 gdb_bfd_openw (const char *filename
, const char *target
)
908 bfd
*result
= bfd_openw (filename
, target
);
910 return gdb_bfd_ref_ptr::new_reference (result
);
916 gdb_bfd_openr_iovec (const char *filename
, const char *target
,
917 void *(*open_func
) (struct bfd
*nbfd
,
920 file_ptr (*pread_func
) (struct bfd
*nbfd
,
925 int (*close_func
) (struct bfd
*nbfd
,
927 int (*stat_func
) (struct bfd
*abfd
,
931 bfd
*result
= bfd_openr_iovec (filename
, target
,
932 open_func
, open_closure
,
933 pread_func
, close_func
, stat_func
);
935 return gdb_bfd_ref_ptr::new_reference (result
);
941 gdb_bfd_mark_parent (bfd
*child
, bfd
*parent
)
943 struct gdb_bfd_data
*gdata
;
946 /* No need to stash the filename here, because we also keep a
947 reference on the parent archive. */
949 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (child
);
950 if (gdata
->archive_bfd
== NULL
)
952 gdata
->archive_bfd
= parent
;
953 gdb_bfd_ref (parent
);
956 gdb_assert (gdata
->archive_bfd
== parent
);
962 gdb_bfd_openr_next_archived_file (bfd
*archive
, bfd
*previous
)
964 bfd
*result
= bfd_openr_next_archived_file (archive
, previous
);
967 gdb_bfd_mark_parent (result
, archive
);
969 return gdb_bfd_ref_ptr (result
);
975 gdb_bfd_record_inclusion (bfd
*includer
, bfd
*includee
)
977 struct gdb_bfd_data
*gdata
;
979 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (includer
);
980 gdata
->included_bfds
.push_back (gdb_bfd_ref_ptr::new_reference (includee
));
985 gdb_static_assert (ARRAY_SIZE (_bfd_std_section
) == 4);
990 gdb_bfd_section_index (bfd
*abfd
, asection
*section
)
994 else if (section
== bfd_com_section_ptr
)
995 return bfd_count_sections (abfd
);
996 else if (section
== bfd_und_section_ptr
)
997 return bfd_count_sections (abfd
) + 1;
998 else if (section
== bfd_abs_section_ptr
)
999 return bfd_count_sections (abfd
) + 2;
1000 else if (section
== bfd_ind_section_ptr
)
1001 return bfd_count_sections (abfd
) + 3;
1002 return section
->index
;
1005 /* See gdb_bfd.h. */
1008 gdb_bfd_count_sections (bfd
*abfd
)
1010 return bfd_count_sections (abfd
) + 4;
1013 /* See gdb_bfd.h. */
1016 gdb_bfd_requires_relocations (bfd
*abfd
)
1018 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
1020 if (gdata
->relocation_computed
== 0)
1024 for (sect
= abfd
->sections
; sect
!= NULL
; sect
= sect
->next
)
1025 if ((sect
->flags
& SEC_RELOC
) != 0)
1027 gdata
->needs_relocations
= 1;
1031 gdata
->relocation_computed
= 1;
1034 return gdata
->needs_relocations
;
1037 /* See gdb_bfd.h. */
1040 gdb_bfd_get_full_section_contents (bfd
*abfd
, asection
*section
,
1041 gdb::byte_vector
*contents
)
1043 bfd_size_type section_size
= bfd_section_size (section
);
1045 contents
->resize (section_size
);
1047 return bfd_get_section_contents (abfd
, section
, contents
->data (), 0,
1051 /* A callback for htab_traverse that prints a single BFD. */
1054 print_one_bfd (void **slot
, void *data
)
1056 bfd
*abfd
= (struct bfd
*) *slot
;
1057 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
1058 struct ui_out
*uiout
= (struct ui_out
*) data
;
1060 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
1061 uiout
->field_signed ("refcount", gdata
->refc
);
1062 uiout
->field_string ("addr", host_address_to_string (abfd
));
1063 uiout
->field_string ("filename", bfd_get_filename (abfd
));
1069 /* Implement the 'maint info bfd' command. */
1072 maintenance_info_bfds (const char *arg
, int from_tty
)
1074 struct ui_out
*uiout
= current_uiout
;
1076 ui_out_emit_table
table_emitter (uiout
, 3, -1, "bfds");
1077 uiout
->table_header (10, ui_left
, "refcount", "Refcount");
1078 uiout
->table_header (18, ui_left
, "addr", "Address");
1079 uiout
->table_header (40, ui_left
, "filename", "Filename");
1081 uiout
->table_body ();
1082 htab_traverse (all_bfds
, print_one_bfd
, uiout
);
1085 void _initialize_gdb_bfd ();
1087 _initialize_gdb_bfd ()
1089 all_bfds
= htab_create_alloc (10, htab_hash_pointer
, htab_eq_pointer
,
1090 NULL
, xcalloc
, xfree
);
1092 add_cmd ("bfds", class_maintenance
, maintenance_info_bfds
, _("\
1093 List the BFDs that are currently open."),
1094 &maintenanceinfolist
);
1096 add_setshow_boolean_cmd ("bfd-sharing", no_class
,
1098 Set whether gdb will share bfds that appear to be the same file."), _("\
1099 Show whether gdb will share bfds that appear to be the same file."), _("\
1100 When enabled gdb will reuse existing bfds rather than reopening the\n\
1101 same file. To decide if two files are the same then gdb compares the\n\
1102 filename, file size, file modification time, and file inode."),
1105 &maintenance_set_cmdlist
,
1106 &maintenance_show_cmdlist
);
1108 add_setshow_zuinteger_cmd ("bfd-cache", class_maintenance
,
1109 &debug_bfd_cache
, _("\
1110 Set bfd cache debugging."), _("\
1111 Show bfd cache debugging."), _("\
1112 When non-zero, bfd cache specific debugging is enabled."),
1114 &show_bfd_cache_debug
,
1115 &setdebuglist
, &showdebuglist
);