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/>. */
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 gdb_bfd_data (bfd
*abfd
)
63 : mtime (bfd_get_mtime (abfd
)),
64 size (bfd_get_size (abfd
)),
65 relocation_computed (0),
66 needs_relocations (0),
71 if (bfd_stat (abfd
, &buf
) == 0)
74 device_id
= buf
.st_dev
;
78 /* The stat failed. */
88 /* The reference count. */
91 /* The mtime of the BFD at the point the cache entry was made. */
94 /* The file size (in bytes) at the point the cache entry was made. */
97 /* The inode of the file at the point the cache entry was made. */
100 /* The device id of the file at the point the cache entry was made. */
103 /* This is true if we have determined whether this BFD has any
104 sections requiring relocation. */
105 unsigned int relocation_computed
: 1;
107 /* This is true if any section needs relocation. */
108 unsigned int needs_relocations
: 1;
110 /* This is true if we have successfully computed the file's CRC. */
111 unsigned int crc_computed
: 1;
113 /* The file's CRC. */
114 unsigned long crc
= 0;
116 /* If the BFD comes from an archive, this points to the archive's
117 BFD. Otherwise, this is NULL. */
118 bfd
*archive_bfd
= nullptr;
120 /* Table of all the bfds this bfd has included. */
121 std::vector
<gdb_bfd_ref_ptr
> included_bfds
;
124 REGISTRY_FIELDS
= {};
127 #define GDB_BFD_DATA_ACCESSOR(ABFD) \
128 ((struct gdb_bfd_data *) bfd_usrdata (ABFD))
130 DEFINE_REGISTRY (bfd
, GDB_BFD_DATA_ACCESSOR
)
132 /* A hash table storing all the BFDs maintained in the cache. */
134 static htab_t gdb_bfd_cache
;
136 /* When true gdb will reuse an existing bfd object if the filename,
137 modification time, and file size all match. */
139 static bool bfd_sharing
= true;
141 show_bfd_sharing (struct ui_file
*file
, int from_tty
,
142 struct cmd_list_element
*c
, const char *value
)
144 fprintf_filtered (file
, _("BFD sharing is %s.\n"), value
);
147 /* When non-zero debugging of the bfd caches is enabled. */
149 static unsigned int debug_bfd_cache
;
151 show_bfd_cache_debug (struct ui_file
*file
, int from_tty
,
152 struct cmd_list_element
*c
, const char *value
)
154 fprintf_filtered (file
, _("BFD cache debugging is %s.\n"), value
);
157 /* The type of an object being looked up in gdb_bfd_cache. We use
158 htab's capability of storing one kind of object (BFD in this case)
159 and using a different sort of object for searching. */
161 struct gdb_bfd_cache_search
164 const char *filename
;
167 /* The file size (in bytes). */
169 /* The inode of the file. */
171 /* The device id of the file. */
175 /* A hash function for BFDs. */
178 hash_bfd (const void *b
)
180 const bfd
*abfd
= (const struct bfd
*) b
;
182 /* It is simplest to just hash the filename. */
183 return htab_hash_string (bfd_get_filename (abfd
));
186 /* An equality function for BFDs. Note that this expects the caller
187 to search using struct gdb_bfd_cache_search only, not BFDs. */
190 eq_bfd (const void *a
, const void *b
)
192 const bfd
*abfd
= (const struct bfd
*) a
;
193 const struct gdb_bfd_cache_search
*s
194 = (const struct gdb_bfd_cache_search
*) b
;
195 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
197 return (gdata
->mtime
== s
->mtime
198 && gdata
->size
== s
->size
199 && gdata
->inode
== s
->inode
200 && gdata
->device_id
== s
->device_id
201 && strcmp (bfd_get_filename (abfd
), s
->filename
) == 0);
207 is_target_filename (const char *name
)
209 return startswith (name
, TARGET_SYSROOT_PREFIX
);
215 gdb_bfd_has_target_filename (struct bfd
*abfd
)
217 return is_target_filename (bfd_get_filename (abfd
));
221 /* Return the system error number corresponding to ERRNUM. */
224 fileio_errno_to_host (int errnum
)
268 case FILEIO_ENAMETOOLONG
:
274 /* Wrapper for target_fileio_open suitable for passing as the
275 OPEN_FUNC argument to gdb_bfd_openr_iovec. The supplied
276 OPEN_CLOSURE is unused. */
279 gdb_bfd_iovec_fileio_open (struct bfd
*abfd
, void *inferior
)
281 const char *filename
= bfd_get_filename (abfd
);
282 int fd
, target_errno
;
285 gdb_assert (is_target_filename (filename
));
287 fd
= target_fileio_open_warn_if_slow ((struct inferior
*) inferior
,
289 + strlen (TARGET_SYSROOT_PREFIX
),
294 errno
= fileio_errno_to_host (target_errno
);
295 bfd_set_error (bfd_error_system_call
);
299 stream
= XCNEW (int);
304 /* Wrapper for target_fileio_pread suitable for passing as the
305 PREAD_FUNC argument to gdb_bfd_openr_iovec. */
308 gdb_bfd_iovec_fileio_pread (struct bfd
*abfd
, void *stream
, void *buf
,
309 file_ptr nbytes
, file_ptr offset
)
311 int fd
= *(int *) stream
;
320 bytes
= target_fileio_pread (fd
, (gdb_byte
*) buf
+ pos
,
321 nbytes
- pos
, offset
+ pos
,
324 /* Success, but no bytes, means end-of-file. */
328 errno
= fileio_errno_to_host (target_errno
);
329 bfd_set_error (bfd_error_system_call
);
339 /* Wrapper for target_fileio_close suitable for passing as the
340 CLOSE_FUNC argument to gdb_bfd_openr_iovec. */
343 gdb_bfd_iovec_fileio_close (struct bfd
*abfd
, void *stream
)
345 int fd
= *(int *) stream
;
350 /* Ignore errors on close. These may happen with remote
351 targets if the connection has already been torn down. */
352 target_fileio_close (fd
, &target_errno
);
354 /* Zero means success. */
358 /* Wrapper for target_fileio_fstat suitable for passing as the
359 STAT_FUNC argument to gdb_bfd_openr_iovec. */
362 gdb_bfd_iovec_fileio_fstat (struct bfd
*abfd
, void *stream
,
365 int fd
= *(int *) stream
;
369 result
= target_fileio_fstat (fd
, sb
, &target_errno
);
372 errno
= fileio_errno_to_host (target_errno
);
373 bfd_set_error (bfd_error_system_call
);
382 gdb_bfd_open (const char *name
, const char *target
, int fd
)
387 struct gdb_bfd_cache_search search
;
390 if (is_target_filename (name
))
392 if (!target_filesystem_is_local ())
394 gdb_assert (fd
== -1);
396 return gdb_bfd_openr_iovec (name
, target
,
397 gdb_bfd_iovec_fileio_open
,
399 gdb_bfd_iovec_fileio_pread
,
400 gdb_bfd_iovec_fileio_close
,
401 gdb_bfd_iovec_fileio_fstat
);
404 name
+= strlen (TARGET_SYSROOT_PREFIX
);
407 if (gdb_bfd_cache
== NULL
)
408 gdb_bfd_cache
= htab_create_alloc (1, hash_bfd
, eq_bfd
, NULL
,
413 fd
= gdb_open_cloexec (name
, O_RDONLY
| O_BINARY
, 0);
416 bfd_set_error (bfd_error_system_call
);
421 search
.filename
= name
;
422 if (fstat (fd
, &st
) < 0)
424 /* Weird situation here. */
428 search
.device_id
= 0;
432 search
.mtime
= st
.st_mtime
;
433 search
.size
= st
.st_size
;
434 search
.inode
= st
.st_ino
;
435 search
.device_id
= st
.st_dev
;
438 /* Note that this must compute the same result as hash_bfd. */
439 hash
= htab_hash_string (name
);
440 /* Note that we cannot use htab_find_slot_with_hash here, because
441 opening the BFD may fail; and this would violate hashtab
443 abfd
= (struct bfd
*) htab_find_with_hash (gdb_bfd_cache
, &search
, hash
);
444 if (bfd_sharing
&& abfd
!= NULL
)
447 fprintf_unfiltered (gdb_stdlog
,
448 "Reusing cached bfd %s for %s\n",
449 host_address_to_string (abfd
),
450 bfd_get_filename (abfd
));
452 return gdb_bfd_ref_ptr::new_reference (abfd
);
455 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
460 fprintf_unfiltered (gdb_stdlog
,
461 "Creating new bfd %s for %s\n",
462 host_address_to_string (abfd
),
463 bfd_get_filename (abfd
));
467 slot
= htab_find_slot_with_hash (gdb_bfd_cache
, &search
, hash
, INSERT
);
472 return gdb_bfd_ref_ptr::new_reference (abfd
);
475 /* A helper function that releases any section data attached to the
479 free_one_bfd_section (bfd
*abfd
, asection
*sectp
, void *ignore
)
481 struct gdb_bfd_section_data
*sect
482 = (struct gdb_bfd_section_data
*) bfd_section_userdata (sectp
);
484 if (sect
!= NULL
&& sect
->data
!= NULL
)
487 if (sect
->map_addr
!= NULL
)
491 res
= munmap (sect
->map_addr
, sect
->map_len
);
492 gdb_assert (res
== 0);
500 /* Close ABFD, and warn if that fails. */
503 gdb_bfd_close_or_warn (struct bfd
*abfd
)
506 const char *name
= bfd_get_filename (abfd
);
508 bfd_map_over_sections (abfd
, free_one_bfd_section
, NULL
);
510 ret
= bfd_close (abfd
);
513 warning (_("cannot close \"%s\": %s"),
514 name
, bfd_errmsg (bfd_get_error ()));
522 gdb_bfd_ref (struct bfd
*abfd
)
524 struct gdb_bfd_data
*gdata
;
530 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
533 fprintf_unfiltered (gdb_stdlog
,
534 "Increase reference count on bfd %s (%s)\n",
535 host_address_to_string (abfd
),
536 bfd_get_filename (abfd
));
544 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
545 abfd
->flags
|= BFD_DECOMPRESS
;
547 gdata
= new gdb_bfd_data (abfd
);
548 bfd_set_usrdata (abfd
, gdata
);
549 bfd_alloc_data (abfd
);
551 /* This is the first we've seen it, so add it to the hash table. */
552 slot
= htab_find_slot (all_bfds
, abfd
, INSERT
);
553 gdb_assert (slot
&& !*slot
);
560 gdb_bfd_unref (struct bfd
*abfd
)
562 struct gdb_bfd_data
*gdata
;
563 struct gdb_bfd_cache_search search
;
569 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
570 gdb_assert (gdata
->refc
>= 1);
576 fprintf_unfiltered (gdb_stdlog
,
577 "Decrease reference count on bfd %s (%s)\n",
578 host_address_to_string (abfd
),
579 bfd_get_filename (abfd
));
584 fprintf_unfiltered (gdb_stdlog
,
585 "Delete final reference count on bfd %s (%s)\n",
586 host_address_to_string (abfd
),
587 bfd_get_filename (abfd
));
589 archive_bfd
= gdata
->archive_bfd
;
590 search
.filename
= bfd_get_filename (abfd
);
592 if (gdb_bfd_cache
&& search
.filename
)
594 hashval_t hash
= htab_hash_string (search
.filename
);
597 search
.mtime
= gdata
->mtime
;
598 search
.size
= gdata
->size
;
599 search
.inode
= gdata
->inode
;
600 search
.device_id
= gdata
->device_id
;
601 slot
= htab_find_slot_with_hash (gdb_bfd_cache
, &search
, hash
,
605 htab_clear_slot (gdb_bfd_cache
, slot
);
608 bfd_free_data (abfd
);
610 bfd_set_usrdata (abfd
, NULL
); /* Paranoia. */
612 htab_remove_elt (all_bfds
, abfd
);
614 gdb_bfd_close_or_warn (abfd
);
616 gdb_bfd_unref (archive_bfd
);
619 /* A helper function that returns the section data descriptor
620 associated with SECTION. If no such descriptor exists, a new one
621 is allocated and cleared. */
623 static struct gdb_bfd_section_data
*
624 get_section_descriptor (asection
*section
)
626 struct gdb_bfd_section_data
*result
;
628 result
= (struct gdb_bfd_section_data
*) bfd_section_userdata (section
);
632 result
= ((struct gdb_bfd_section_data
*)
633 bfd_zalloc (section
->owner
, sizeof (*result
)));
634 bfd_set_section_userdata (section
, result
);
643 gdb_bfd_map_section (asection
*sectp
, bfd_size_type
*size
)
646 struct gdb_bfd_section_data
*descriptor
;
649 gdb_assert ((sectp
->flags
& SEC_RELOC
) == 0);
650 gdb_assert (size
!= NULL
);
654 descriptor
= get_section_descriptor (sectp
);
656 /* If the data was already read for this BFD, just reuse it. */
657 if (descriptor
->data
!= NULL
)
661 if (!bfd_is_section_compressed (abfd
, sectp
))
663 /* The page size, used when mmapping. */
667 pagesize
= getpagesize ();
669 /* Only try to mmap sections which are large enough: we don't want
670 to waste space due to fragmentation. */
672 if (bfd_section_size (sectp
) > 4 * pagesize
)
674 descriptor
->size
= bfd_section_size (sectp
);
675 descriptor
->data
= bfd_mmap (abfd
, 0, descriptor
->size
, PROT_READ
,
676 MAP_PRIVATE
, sectp
->filepos
,
677 &descriptor
->map_addr
,
678 &descriptor
->map_len
);
680 if ((caddr_t
)descriptor
->data
!= MAP_FAILED
)
682 #if HAVE_POSIX_MADVISE
683 posix_madvise (descriptor
->map_addr
, descriptor
->map_len
,
684 POSIX_MADV_WILLNEED
);
689 /* On failure, clear out the section data and try again. */
690 memset (descriptor
, 0, sizeof (*descriptor
));
693 #endif /* HAVE_MMAP */
695 /* Handle compressed sections, or ordinary uncompressed sections in
698 descriptor
->size
= bfd_section_size (sectp
);
699 descriptor
->data
= NULL
;
702 if (!bfd_get_full_section_contents (abfd
, sectp
, &data
))
704 warning (_("Can't read data for section '%s' in file '%s'"),
705 bfd_section_name (sectp
),
706 bfd_get_filename (abfd
));
707 /* Set size to 0 to prevent further attempts to read the invalid
712 descriptor
->data
= data
;
715 gdb_assert (descriptor
->data
!= NULL
);
716 *size
= descriptor
->size
;
717 return (const gdb_byte
*) descriptor
->data
;
720 /* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
721 return 1. Otherwise print a warning and return 0. ABFD seek position is
725 get_file_crc (bfd
*abfd
, unsigned long *file_crc_return
)
727 unsigned long file_crc
= 0;
729 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
731 warning (_("Problem reading \"%s\" for CRC: %s"),
732 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
738 gdb_byte buffer
[8 * 1024];
741 count
= bfd_bread (buffer
, sizeof (buffer
), abfd
);
742 if (count
== (bfd_size_type
) -1)
744 warning (_("Problem reading \"%s\" for CRC: %s"),
745 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
750 file_crc
= bfd_calc_gnu_debuglink_crc32 (file_crc
, buffer
, count
);
753 *file_crc_return
= file_crc
;
760 gdb_bfd_crc (struct bfd
*abfd
, unsigned long *crc_out
)
762 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
764 if (!gdata
->crc_computed
)
765 gdata
->crc_computed
= get_file_crc (abfd
, &gdata
->crc
);
767 if (gdata
->crc_computed
)
768 *crc_out
= gdata
->crc
;
769 return gdata
->crc_computed
;
777 gdb_bfd_fopen (const char *filename
, const char *target
, const char *mode
,
780 bfd
*result
= bfd_fopen (filename
, target
, mode
, fd
);
782 return gdb_bfd_ref_ptr::new_reference (result
);
788 gdb_bfd_openr (const char *filename
, const char *target
)
790 bfd
*result
= bfd_openr (filename
, target
);
792 return gdb_bfd_ref_ptr::new_reference (result
);
798 gdb_bfd_openw (const char *filename
, const char *target
)
800 bfd
*result
= bfd_openw (filename
, target
);
802 return gdb_bfd_ref_ptr::new_reference (result
);
808 gdb_bfd_openr_iovec (const char *filename
, const char *target
,
809 void *(*open_func
) (struct bfd
*nbfd
,
812 file_ptr (*pread_func
) (struct bfd
*nbfd
,
817 int (*close_func
) (struct bfd
*nbfd
,
819 int (*stat_func
) (struct bfd
*abfd
,
823 bfd
*result
= bfd_openr_iovec (filename
, target
,
824 open_func
, open_closure
,
825 pread_func
, close_func
, stat_func
);
827 return gdb_bfd_ref_ptr::new_reference (result
);
833 gdb_bfd_mark_parent (bfd
*child
, bfd
*parent
)
835 struct gdb_bfd_data
*gdata
;
838 /* No need to stash the filename here, because we also keep a
839 reference on the parent archive. */
841 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (child
);
842 if (gdata
->archive_bfd
== NULL
)
844 gdata
->archive_bfd
= parent
;
845 gdb_bfd_ref (parent
);
848 gdb_assert (gdata
->archive_bfd
== parent
);
854 gdb_bfd_openr_next_archived_file (bfd
*archive
, bfd
*previous
)
856 bfd
*result
= bfd_openr_next_archived_file (archive
, previous
);
859 gdb_bfd_mark_parent (result
, archive
);
861 return gdb_bfd_ref_ptr (result
);
867 gdb_bfd_record_inclusion (bfd
*includer
, bfd
*includee
)
869 struct gdb_bfd_data
*gdata
;
871 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (includer
);
872 gdata
->included_bfds
.push_back (gdb_bfd_ref_ptr::new_reference (includee
));
877 gdb_static_assert (ARRAY_SIZE (_bfd_std_section
) == 4);
882 gdb_bfd_section_index (bfd
*abfd
, asection
*section
)
886 else if (section
== bfd_com_section_ptr
)
887 return bfd_count_sections (abfd
);
888 else if (section
== bfd_und_section_ptr
)
889 return bfd_count_sections (abfd
) + 1;
890 else if (section
== bfd_abs_section_ptr
)
891 return bfd_count_sections (abfd
) + 2;
892 else if (section
== bfd_ind_section_ptr
)
893 return bfd_count_sections (abfd
) + 3;
894 return section
->index
;
900 gdb_bfd_count_sections (bfd
*abfd
)
902 return bfd_count_sections (abfd
) + 4;
908 gdb_bfd_requires_relocations (bfd
*abfd
)
910 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
912 if (gdata
->relocation_computed
== 0)
916 for (sect
= abfd
->sections
; sect
!= NULL
; sect
= sect
->next
)
917 if ((sect
->flags
& SEC_RELOC
) != 0)
919 gdata
->needs_relocations
= 1;
923 gdata
->relocation_computed
= 1;
926 return gdata
->needs_relocations
;
931 /* A callback for htab_traverse that prints a single BFD. */
934 print_one_bfd (void **slot
, void *data
)
936 bfd
*abfd
= (struct bfd
*) *slot
;
937 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
938 struct ui_out
*uiout
= (struct ui_out
*) data
;
940 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
941 uiout
->field_signed ("refcount", gdata
->refc
);
942 uiout
->field_string ("addr", host_address_to_string (abfd
));
943 uiout
->field_string ("filename", bfd_get_filename (abfd
));
949 /* Implement the 'maint info bfd' command. */
952 maintenance_info_bfds (const char *arg
, int from_tty
)
954 struct ui_out
*uiout
= current_uiout
;
956 ui_out_emit_table
table_emitter (uiout
, 3, -1, "bfds");
957 uiout
->table_header (10, ui_left
, "refcount", "Refcount");
958 uiout
->table_header (18, ui_left
, "addr", "Address");
959 uiout
->table_header (40, ui_left
, "filename", "Filename");
961 uiout
->table_body ();
962 htab_traverse (all_bfds
, print_one_bfd
, uiout
);
966 _initialize_gdb_bfd (void)
968 all_bfds
= htab_create_alloc (10, htab_hash_pointer
, htab_eq_pointer
,
969 NULL
, xcalloc
, xfree
);
971 add_cmd ("bfds", class_maintenance
, maintenance_info_bfds
, _("\
972 List the BFDs that are currently open."),
973 &maintenanceinfolist
);
975 add_setshow_boolean_cmd ("bfd-sharing", no_class
,
977 Set whether gdb will share bfds that appear to be the same file."), _("\
978 Show whether gdb will share bfds that appear to be the same file."), _("\
979 When enabled gdb will reuse existing bfds rather than reopening the\n\
980 same file. To decide if two files are the same then gdb compares the\n\
981 filename, file size, file modification time, and file inode."),
984 &maintenance_set_cmdlist
,
985 &maintenance_show_cmdlist
);
987 add_setshow_zuinteger_cmd ("bfd-cache", class_maintenance
,
988 &debug_bfd_cache
, _("\
989 Set bfd cache debugging."), _("\
990 Show bfd cache debugging."), _("\
991 When non-zero, bfd cache specific debugging is enabled."),
993 &show_bfd_cache_debug
,
994 &setdebuglist
, &showdebuglist
);