1 /* Definitions for BFD wrappers used by GDB.
3 Copyright (C) 2011-2022 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 "gdbsupport/fileio.h"
35 #include "cli/cli-style.h"
36 #include <unordered_map>
38 /* An object of this type is stored in the section's user data when
41 struct gdb_bfd_section_data
43 /* Size of the data. */
45 /* If the data was mmapped, this is the length of the map. */
46 bfd_size_type map_len
;
47 /* The data. If NULL, the section data has not been read. */
49 /* If the data was mmapped, this is the map address. */
53 /* A hash table holding every BFD that gdb knows about. This is not
54 to be confused with 'gdb_bfd_cache', which is used for sharing
55 BFDs; in contrast, this hash is used just to implement
58 static htab_t all_bfds
;
60 /* An object of this type is stored in each BFD's user data. */
64 /* Note that if ST is nullptr, then we simply fill in zeroes. */
65 gdb_bfd_data (bfd
*abfd
, struct stat
*st
)
66 : mtime (st
== nullptr ? 0 : st
->st_mtime
),
67 size (st
== nullptr ? 0 : st
->st_size
),
68 inode (st
== nullptr ? 0 : st
->st_ino
),
69 device_id (st
== nullptr ? 0 : st
->st_dev
),
70 relocation_computed (0),
71 needs_relocations (0),
80 /* The reference count. */
83 /* The mtime of the BFD at the point the cache entry was made. */
86 /* The file size (in bytes) at the point the cache entry was made. */
89 /* The inode of the file at the point the cache entry was made. */
92 /* The device id of the file at the point the cache entry was made. */
95 /* This is true if we have determined whether this BFD has any
96 sections requiring relocation. */
97 unsigned int relocation_computed
: 1;
99 /* This is true if any section needs relocation. */
100 unsigned int needs_relocations
: 1;
102 /* This is true if we have successfully computed the file's CRC. */
103 unsigned int crc_computed
: 1;
105 /* The file's CRC. */
106 unsigned long crc
= 0;
108 /* If the BFD comes from an archive, this points to the archive's
109 BFD. Otherwise, this is NULL. */
110 bfd
*archive_bfd
= nullptr;
112 /* Table of all the bfds this bfd has included. */
113 std::vector
<gdb_bfd_ref_ptr
> included_bfds
;
116 registry
<bfd
> registry_fields
;
120 registry_accessor
<bfd
>::get (bfd
*abfd
)
122 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
123 return &gdata
->registry_fields
;
126 /* A hash table storing all the BFDs maintained in the cache. */
128 static htab_t gdb_bfd_cache
;
130 /* When true gdb will reuse an existing bfd object if the filename,
131 modification time, and file size all match. */
133 static bool bfd_sharing
= true;
135 show_bfd_sharing (struct ui_file
*file
, int from_tty
,
136 struct cmd_list_element
*c
, const char *value
)
138 gdb_printf (file
, _("BFD sharing is %s.\n"), value
);
141 /* When true debugging of the bfd caches is enabled. */
143 static bool debug_bfd_cache
;
145 /* Print an "bfd-cache" debug statement. */
147 #define bfd_cache_debug_printf(fmt, ...) \
148 debug_prefixed_printf_cond (debug_bfd_cache, "bfd-cache", fmt, ##__VA_ARGS__)
151 show_bfd_cache_debug (struct ui_file
*file
, int from_tty
,
152 struct cmd_list_element
*c
, const char *value
)
154 gdb_printf (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
));
220 /* For `gdb_bfd_open_from_target_memory`. An object that manages the
221 details of a BFD in target memory. */
225 /* Constructor. BASE and SIZE define where the BFD can be found in
227 target_buffer (CORE_ADDR base
, ULONGEST size
)
232 = xstrprintf ("<in-memory@%s>", core_addr_to_string_nz (m_base
));
235 /* Return the size of the in-memory BFD file. */
236 ULONGEST
size () const
239 /* Return the base address of the in-memory BFD file. */
240 CORE_ADDR
base () const
243 /* Return a generated filename for the in-memory BFD file. The generated
244 name will include the M_BASE value. */
245 const char *filename () const
246 { return m_filename
.get (); }
249 /* The base address of the in-memory BFD file. */
252 /* The size (in-bytes) of the in-memory BFD file. */
255 /* Holds the generated name of the in-memory BFD file. */
256 gdb::unique_xmalloc_ptr
<char> m_filename
;
259 /* For `gdb_bfd_open_from_target_memory`. Opening the file is a no-op. */
262 mem_bfd_iovec_open (struct bfd
*abfd
, void *open_closure
)
267 /* For `gdb_bfd_open_from_target_memory`. Closing the file is just freeing the
268 base/size pair on our side. */
271 mem_bfd_iovec_close (struct bfd
*abfd
, void *stream
)
273 struct target_buffer
*buffer
= (target_buffer
*) stream
;
276 /* Zero means success. */
280 /* For `gdb_bfd_open_from_target_memory`. For reading the file, we just need to
281 pass through to target_read_memory and fix up the arguments and return
285 mem_bfd_iovec_pread (struct bfd
*abfd
, void *stream
, void *buf
,
286 file_ptr nbytes
, file_ptr offset
)
288 struct target_buffer
*buffer
= (struct target_buffer
*) stream
;
290 /* If this read will read all of the file, limit it to just the rest. */
291 if (offset
+ nbytes
> buffer
->size ())
292 nbytes
= buffer
->size () - offset
;
294 /* If there are no more bytes left, we've reached EOF. */
299 = target_read_memory (buffer
->base () + offset
, (gdb_byte
*) buf
, nbytes
);
306 /* For `gdb_bfd_open_from_target_memory`. For statting the file, we only
307 support the st_size attribute. */
310 mem_bfd_iovec_stat (struct bfd
*abfd
, void *stream
, struct stat
*sb
)
312 struct target_buffer
*buffer
= (struct target_buffer
*) stream
;
314 memset (sb
, 0, sizeof (struct stat
));
315 sb
->st_size
= buffer
->size ();
322 gdb_bfd_open_from_target_memory (CORE_ADDR addr
, ULONGEST size
,
325 struct target_buffer
*buffer
= new target_buffer (addr
, size
);
327 return gdb_bfd_openr_iovec (buffer
->filename (), target
,
335 /* bfd_openr_iovec OPEN_CLOSURE data for gdb_bfd_open. */
336 struct gdb_bfd_open_closure
342 /* Wrapper for target_fileio_open suitable for passing as the
343 OPEN_FUNC argument to gdb_bfd_openr_iovec. */
346 gdb_bfd_iovec_fileio_open (struct bfd
*abfd
, void *open_closure
)
348 const char *filename
= bfd_get_filename (abfd
);
350 fileio_error target_errno
;
352 gdb_bfd_open_closure
*oclosure
= (gdb_bfd_open_closure
*) open_closure
;
354 gdb_assert (is_target_filename (filename
));
356 fd
= target_fileio_open (oclosure
->inf
,
357 filename
+ strlen (TARGET_SYSROOT_PREFIX
),
358 FILEIO_O_RDONLY
, 0, oclosure
->warn_if_slow
,
362 errno
= fileio_error_to_host (target_errno
);
363 bfd_set_error (bfd_error_system_call
);
367 stream
= XCNEW (int);
372 /* Wrapper for target_fileio_pread suitable for passing as the
373 PREAD_FUNC argument to gdb_bfd_openr_iovec. */
376 gdb_bfd_iovec_fileio_pread (struct bfd
*abfd
, void *stream
, void *buf
,
377 file_ptr nbytes
, file_ptr offset
)
379 int fd
= *(int *) stream
;
380 fileio_error target_errno
;
388 bytes
= target_fileio_pread (fd
, (gdb_byte
*) buf
+ pos
,
389 nbytes
- pos
, offset
+ pos
,
392 /* Success, but no bytes, means end-of-file. */
396 errno
= fileio_error_to_host (target_errno
);
397 bfd_set_error (bfd_error_system_call
);
407 /* Warn that it wasn't possible to close a bfd for file NAME, because
411 gdb_bfd_close_warning (const char *name
, const char *reason
)
413 warning (_("cannot close \"%s\": %s"), name
, reason
);
416 /* Wrapper for target_fileio_close suitable for passing as the
417 CLOSE_FUNC argument to gdb_bfd_openr_iovec. */
420 gdb_bfd_iovec_fileio_close (struct bfd
*abfd
, void *stream
)
422 int fd
= *(int *) stream
;
423 fileio_error target_errno
;
427 /* Ignore errors on close. These may happen with remote
428 targets if the connection has already been torn down. */
431 target_fileio_close (fd
, &target_errno
);
433 catch (const gdb_exception
&ex
)
435 /* Also avoid crossing exceptions over bfd. */
436 gdb_bfd_close_warning (bfd_get_filename (abfd
),
437 ex
.message
->c_str ());
440 /* Zero means success. */
444 /* Wrapper for target_fileio_fstat suitable for passing as the
445 STAT_FUNC argument to gdb_bfd_openr_iovec. */
448 gdb_bfd_iovec_fileio_fstat (struct bfd
*abfd
, void *stream
,
451 int fd
= *(int *) stream
;
452 fileio_error target_errno
;
455 result
= target_fileio_fstat (fd
, sb
, &target_errno
);
458 errno
= fileio_error_to_host (target_errno
);
459 bfd_set_error (bfd_error_system_call
);
465 /* A helper function to initialize the data that gdb attaches to each
469 gdb_bfd_init_data (struct bfd
*abfd
, struct stat
*st
)
471 struct gdb_bfd_data
*gdata
;
474 gdb_assert (bfd_usrdata (abfd
) == nullptr);
476 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
477 abfd
->flags
|= BFD_DECOMPRESS
;
479 gdata
= new gdb_bfd_data (abfd
, st
);
480 bfd_set_usrdata (abfd
, gdata
);
482 /* This is the first we've seen it, so add it to the hash table. */
483 slot
= htab_find_slot (all_bfds
, abfd
, INSERT
);
484 gdb_assert (slot
&& !*slot
);
491 gdb_bfd_open (const char *name
, const char *target
, int fd
,
497 struct gdb_bfd_cache_search search
;
500 if (is_target_filename (name
))
502 if (!target_filesystem_is_local ())
504 gdb_assert (fd
== -1);
506 gdb_bfd_open_closure open_closure
{ current_inferior (), warn_if_slow
};
507 return gdb_bfd_openr_iovec (name
, target
,
508 gdb_bfd_iovec_fileio_open
,
510 gdb_bfd_iovec_fileio_pread
,
511 gdb_bfd_iovec_fileio_close
,
512 gdb_bfd_iovec_fileio_fstat
);
515 name
+= strlen (TARGET_SYSROOT_PREFIX
);
518 if (gdb_bfd_cache
== NULL
)
519 gdb_bfd_cache
= htab_create_alloc (1, hash_bfd
, eq_bfd
, NULL
,
524 fd
= gdb_open_cloexec (name
, O_RDONLY
| O_BINARY
, 0).release ();
527 bfd_set_error (bfd_error_system_call
);
532 if (fstat (fd
, &st
) < 0)
534 /* Weird situation here -- don't cache if we can't stat. */
535 bfd_cache_debug_printf ("Could not stat %s - not caching", name
);
536 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
539 return gdb_bfd_ref_ptr::new_reference (abfd
);
542 search
.filename
= name
;
543 search
.mtime
= st
.st_mtime
;
544 search
.size
= st
.st_size
;
545 search
.inode
= st
.st_ino
;
546 search
.device_id
= st
.st_dev
;
548 /* Note that this must compute the same result as hash_bfd. */
549 hash
= htab_hash_string (name
);
550 /* Note that we cannot use htab_find_slot_with_hash here, because
551 opening the BFD may fail; and this would violate hashtab
553 abfd
= (struct bfd
*) htab_find_with_hash (gdb_bfd_cache
, &search
, hash
);
554 if (bfd_sharing
&& abfd
!= NULL
)
556 bfd_cache_debug_printf ("Reusing cached bfd %s for %s",
557 host_address_to_string (abfd
),
558 bfd_get_filename (abfd
));
560 return gdb_bfd_ref_ptr::new_reference (abfd
);
563 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
567 bfd_cache_debug_printf ("Creating new bfd %s for %s",
568 host_address_to_string (abfd
),
569 bfd_get_filename (abfd
));
573 slot
= htab_find_slot_with_hash (gdb_bfd_cache
, &search
, hash
, INSERT
);
578 /* It's important to pass the already-computed stat info here,
579 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
580 default will "stat" the file each time bfd_get_mtime is called --
581 and since we already entered it into the hash table using this
582 mtime, if the file changed at the wrong moment, the race would
583 lead to a hash table corruption. */
584 gdb_bfd_init_data (abfd
, &st
);
585 return gdb_bfd_ref_ptr (abfd
);
588 /* A helper function that releases any section data attached to the
592 free_one_bfd_section (asection
*sectp
)
594 struct gdb_bfd_section_data
*sect
595 = (struct gdb_bfd_section_data
*) bfd_section_userdata (sectp
);
597 if (sect
!= NULL
&& sect
->data
!= NULL
)
600 if (sect
->map_addr
!= NULL
)
604 res
= munmap (sect
->map_addr
, sect
->map_len
);
605 gdb_assert (res
== 0);
613 /* Close ABFD, and warn if that fails. */
616 gdb_bfd_close_or_warn (struct bfd
*abfd
)
619 const char *name
= bfd_get_filename (abfd
);
621 for (asection
*sect
: gdb_bfd_sections (abfd
))
622 free_one_bfd_section (sect
);
624 ret
= bfd_close (abfd
);
627 gdb_bfd_close_warning (name
,
628 bfd_errmsg (bfd_get_error ()));
636 gdb_bfd_ref (struct bfd
*abfd
)
638 struct gdb_bfd_data
*gdata
;
643 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
645 bfd_cache_debug_printf ("Increase reference count on bfd %s (%s)",
646 host_address_to_string (abfd
),
647 bfd_get_filename (abfd
));
655 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
657 gdb_bfd_init_data (abfd
, nullptr);
663 gdb_bfd_unref (struct bfd
*abfd
)
665 struct gdb_bfd_data
*gdata
;
666 struct gdb_bfd_cache_search search
;
672 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
673 gdb_assert (gdata
->refc
>= 1);
678 bfd_cache_debug_printf ("Decrease reference count on bfd %s (%s)",
679 host_address_to_string (abfd
),
680 bfd_get_filename (abfd
));
684 bfd_cache_debug_printf ("Delete final reference count on bfd %s (%s)",
685 host_address_to_string (abfd
),
686 bfd_get_filename (abfd
));
688 archive_bfd
= gdata
->archive_bfd
;
689 search
.filename
= bfd_get_filename (abfd
);
691 if (gdb_bfd_cache
&& search
.filename
)
693 hashval_t hash
= htab_hash_string (search
.filename
);
696 search
.mtime
= gdata
->mtime
;
697 search
.size
= gdata
->size
;
698 search
.inode
= gdata
->inode
;
699 search
.device_id
= gdata
->device_id
;
700 slot
= htab_find_slot_with_hash (gdb_bfd_cache
, &search
, hash
,
704 htab_clear_slot (gdb_bfd_cache
, slot
);
708 bfd_set_usrdata (abfd
, NULL
); /* Paranoia. */
710 htab_remove_elt (all_bfds
, abfd
);
712 gdb_bfd_close_or_warn (abfd
);
714 gdb_bfd_unref (archive_bfd
);
717 /* A helper function that returns the section data descriptor
718 associated with SECTION. If no such descriptor exists, a new one
719 is allocated and cleared. */
721 static struct gdb_bfd_section_data
*
722 get_section_descriptor (asection
*section
)
724 struct gdb_bfd_section_data
*result
;
726 result
= (struct gdb_bfd_section_data
*) bfd_section_userdata (section
);
730 result
= ((struct gdb_bfd_section_data
*)
731 bfd_zalloc (section
->owner
, sizeof (*result
)));
732 bfd_set_section_userdata (section
, result
);
741 gdb_bfd_map_section (asection
*sectp
, bfd_size_type
*size
)
744 struct gdb_bfd_section_data
*descriptor
;
747 gdb_assert ((sectp
->flags
& SEC_RELOC
) == 0);
748 gdb_assert (size
!= NULL
);
752 descriptor
= get_section_descriptor (sectp
);
754 /* If the data was already read for this BFD, just reuse it. */
755 if (descriptor
->data
!= NULL
)
759 if (!bfd_is_section_compressed (abfd
, sectp
))
761 /* The page size, used when mmapping. */
765 pagesize
= getpagesize ();
767 /* Only try to mmap sections which are large enough: we don't want
768 to waste space due to fragmentation. */
770 if (bfd_section_size (sectp
) > 4 * pagesize
)
772 descriptor
->size
= bfd_section_size (sectp
);
773 descriptor
->data
= bfd_mmap (abfd
, 0, descriptor
->size
, PROT_READ
,
774 MAP_PRIVATE
, sectp
->filepos
,
775 &descriptor
->map_addr
,
776 &descriptor
->map_len
);
778 if ((caddr_t
)descriptor
->data
!= MAP_FAILED
)
780 #if HAVE_POSIX_MADVISE
781 posix_madvise (descriptor
->map_addr
, descriptor
->map_len
,
782 POSIX_MADV_WILLNEED
);
787 /* On failure, clear out the section data and try again. */
788 memset (descriptor
, 0, sizeof (*descriptor
));
791 #endif /* HAVE_MMAP */
793 /* Handle compressed sections, or ordinary uncompressed sections in
796 descriptor
->size
= bfd_section_size (sectp
);
797 descriptor
->data
= NULL
;
800 if (!bfd_get_full_section_contents (abfd
, sectp
, &data
))
802 warning (_("Can't read data for section '%s' in file '%s'"),
803 bfd_section_name (sectp
),
804 bfd_get_filename (abfd
));
805 /* Set size to 0 to prevent further attempts to read the invalid
810 descriptor
->data
= data
;
813 gdb_assert (descriptor
->data
!= NULL
);
814 *size
= descriptor
->size
;
815 return (const gdb_byte
*) descriptor
->data
;
818 /* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
819 return 1. Otherwise print a warning and return 0. ABFD seek position is
823 get_file_crc (bfd
*abfd
, unsigned long *file_crc_return
)
825 unsigned long file_crc
= 0;
827 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
829 warning (_("Problem reading \"%s\" for CRC: %s"),
830 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
836 gdb_byte buffer
[8 * 1024];
839 count
= bfd_bread (buffer
, sizeof (buffer
), abfd
);
840 if (count
== (bfd_size_type
) -1)
842 warning (_("Problem reading \"%s\" for CRC: %s"),
843 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
848 file_crc
= bfd_calc_gnu_debuglink_crc32 (file_crc
, buffer
, count
);
851 *file_crc_return
= file_crc
;
858 gdb_bfd_crc (struct bfd
*abfd
, unsigned long *crc_out
)
860 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
862 if (!gdata
->crc_computed
)
863 gdata
->crc_computed
= get_file_crc (abfd
, &gdata
->crc
);
865 if (gdata
->crc_computed
)
866 *crc_out
= gdata
->crc
;
867 return gdata
->crc_computed
;
875 gdb_bfd_fopen (const char *filename
, const char *target
, const char *mode
,
878 bfd
*result
= bfd_fopen (filename
, target
, mode
, fd
);
880 return gdb_bfd_ref_ptr::new_reference (result
);
886 gdb_bfd_openr (const char *filename
, const char *target
)
888 bfd
*result
= bfd_openr (filename
, target
);
890 return gdb_bfd_ref_ptr::new_reference (result
);
896 gdb_bfd_openw (const char *filename
, const char *target
)
898 bfd
*result
= bfd_openw (filename
, target
);
900 return gdb_bfd_ref_ptr::new_reference (result
);
906 gdb_bfd_openr_iovec (const char *filename
, const char *target
,
907 void *(*open_func
) (struct bfd
*nbfd
,
910 file_ptr (*pread_func
) (struct bfd
*nbfd
,
915 int (*close_func
) (struct bfd
*nbfd
,
917 int (*stat_func
) (struct bfd
*abfd
,
921 bfd
*result
= bfd_openr_iovec (filename
, target
,
922 open_func
, open_closure
,
923 pread_func
, close_func
, stat_func
);
925 return gdb_bfd_ref_ptr::new_reference (result
);
931 gdb_bfd_mark_parent (bfd
*child
, bfd
*parent
)
933 struct gdb_bfd_data
*gdata
;
936 /* No need to stash the filename here, because we also keep a
937 reference on the parent archive. */
939 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (child
);
940 if (gdata
->archive_bfd
== NULL
)
942 gdata
->archive_bfd
= parent
;
943 gdb_bfd_ref (parent
);
946 gdb_assert (gdata
->archive_bfd
== parent
);
952 gdb_bfd_openr_next_archived_file (bfd
*archive
, bfd
*previous
)
954 bfd
*result
= bfd_openr_next_archived_file (archive
, previous
);
957 gdb_bfd_mark_parent (result
, archive
);
959 return gdb_bfd_ref_ptr (result
);
965 gdb_bfd_record_inclusion (bfd
*includer
, bfd
*includee
)
967 struct gdb_bfd_data
*gdata
;
969 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (includer
);
970 gdata
->included_bfds
.push_back (gdb_bfd_ref_ptr::new_reference (includee
));
975 gdb_static_assert (ARRAY_SIZE (_bfd_std_section
) == 4);
980 gdb_bfd_section_index (bfd
*abfd
, asection
*section
)
984 else if (section
== bfd_com_section_ptr
)
985 return bfd_count_sections (abfd
);
986 else if (section
== bfd_und_section_ptr
)
987 return bfd_count_sections (abfd
) + 1;
988 else if (section
== bfd_abs_section_ptr
)
989 return bfd_count_sections (abfd
) + 2;
990 else if (section
== bfd_ind_section_ptr
)
991 return bfd_count_sections (abfd
) + 3;
992 return section
->index
;
998 gdb_bfd_count_sections (bfd
*abfd
)
1000 return bfd_count_sections (abfd
) + 4;
1003 /* See gdb_bfd.h. */
1006 gdb_bfd_requires_relocations (bfd
*abfd
)
1008 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
1010 if (gdata
->relocation_computed
== 0)
1014 for (sect
= abfd
->sections
; sect
!= NULL
; sect
= sect
->next
)
1015 if ((sect
->flags
& SEC_RELOC
) != 0)
1017 gdata
->needs_relocations
= 1;
1021 gdata
->relocation_computed
= 1;
1024 return gdata
->needs_relocations
;
1027 /* See gdb_bfd.h. */
1030 gdb_bfd_get_full_section_contents (bfd
*abfd
, asection
*section
,
1031 gdb::byte_vector
*contents
)
1033 bfd_size_type section_size
= bfd_section_size (section
);
1035 contents
->resize (section_size
);
1037 return bfd_get_section_contents (abfd
, section
, contents
->data (), 0,
1041 #define AMBIGUOUS_MESS1 ".\nMatching formats:"
1042 #define AMBIGUOUS_MESS2 \
1043 ".\nUse \"set gnutarget format-name\" to specify the format."
1045 /* See gdb_bfd.h. */
1048 gdb_bfd_errmsg (bfd_error_type error_tag
, char **matching
)
1052 /* Check if errmsg just need simple return. */
1053 if (error_tag
!= bfd_error_file_ambiguously_recognized
|| matching
== NULL
)
1054 return bfd_errmsg (error_tag
);
1056 std::string
ret (bfd_errmsg (error_tag
));
1057 ret
+= AMBIGUOUS_MESS1
;
1059 for (p
= matching
; *p
; p
++)
1064 ret
+= AMBIGUOUS_MESS2
;
1071 /* A callback for htab_traverse that prints a single BFD. */
1074 print_one_bfd (void **slot
, void *data
)
1076 bfd
*abfd
= (struct bfd
*) *slot
;
1077 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
1078 struct ui_out
*uiout
= (struct ui_out
*) data
;
1080 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
1081 uiout
->field_signed ("refcount", gdata
->refc
);
1082 uiout
->field_string ("addr", host_address_to_string (abfd
));
1083 uiout
->field_string ("filename", bfd_get_filename (abfd
),
1084 file_name_style
.style ());
1090 /* Implement the 'maint info bfd' command. */
1093 maintenance_info_bfds (const char *arg
, int from_tty
)
1095 struct ui_out
*uiout
= current_uiout
;
1097 ui_out_emit_table
table_emitter (uiout
, 3, -1, "bfds");
1098 uiout
->table_header (10, ui_left
, "refcount", "Refcount");
1099 uiout
->table_header (18, ui_left
, "addr", "Address");
1100 uiout
->table_header (40, ui_left
, "filename", "Filename");
1102 uiout
->table_body ();
1103 htab_traverse (all_bfds
, print_one_bfd
, uiout
);
1106 /* BFD related per-inferior data. */
1108 struct bfd_inferior_data
1110 std::unordered_map
<std::string
, unsigned long> bfd_error_string_counts
;
1113 /* Per-inferior data key. */
1115 static const registry
<inferior
>::key
<bfd_inferior_data
> bfd_inferior_data_key
;
1117 /* Fetch per-inferior BFD data. It always returns a valid pointer to
1118 a bfd_inferior_data struct. */
1120 static struct bfd_inferior_data
*
1121 get_bfd_inferior_data (struct inferior
*inf
)
1123 struct bfd_inferior_data
*data
;
1125 data
= bfd_inferior_data_key
.get (inf
);
1126 if (data
== nullptr)
1127 data
= bfd_inferior_data_key
.emplace (inf
);
1132 /* Increment the BFD error count for STR and return the updated
1135 static unsigned long
1136 increment_bfd_error_count (std::string str
)
1138 struct bfd_inferior_data
*bid
= get_bfd_inferior_data (current_inferior ());
1140 auto &map
= bid
->bfd_error_string_counts
;
1141 return ++map
[std::move (str
)];
1144 static bfd_error_handler_type default_bfd_error_handler
;
1146 /* Define a BFD error handler which will suppress the printing of
1147 messages which have been printed once already. This is done on a
1148 per-inferior basis. */
1150 static void ATTRIBUTE_PRINTF (1, 0)
1151 gdb_bfd_error_handler (const char *fmt
, va_list ap
)
1155 va_copy(ap_copy
, ap
);
1156 const std::string str
= string_vprintf (fmt
, ap_copy
);
1159 if (increment_bfd_error_count (std::move (str
)) > 1)
1162 /* We must call the BFD mechanism for printing format strings since
1163 it supports additional format specifiers that GDB's vwarning() doesn't
1164 recognize. It also outputs additional text, i.e. "BFD: ", which
1165 makes it clear that it's a BFD warning/error. */
1166 (*default_bfd_error_handler
) (fmt
, ap
);
1169 void _initialize_gdb_bfd ();
1171 _initialize_gdb_bfd ()
1173 all_bfds
= htab_create_alloc (10, htab_hash_pointer
, htab_eq_pointer
,
1174 NULL
, xcalloc
, xfree
);
1176 add_cmd ("bfds", class_maintenance
, maintenance_info_bfds
, _("\
1177 List the BFDs that are currently open."),
1178 &maintenanceinfolist
);
1180 add_setshow_boolean_cmd ("bfd-sharing", no_class
,
1182 Set whether gdb will share bfds that appear to be the same file."), _("\
1183 Show whether gdb will share bfds that appear to be the same file."), _("\
1184 When enabled gdb will reuse existing bfds rather than reopening the\n\
1185 same file. To decide if two files are the same then gdb compares the\n\
1186 filename, file size, file modification time, and file inode."),
1189 &maintenance_set_cmdlist
,
1190 &maintenance_show_cmdlist
);
1192 add_setshow_boolean_cmd ("bfd-cache", class_maintenance
,
1194 _("Set bfd cache debugging."),
1195 _("Show bfd cache debugging."),
1197 When non-zero, bfd cache specific debugging is enabled."),
1199 &show_bfd_cache_debug
,
1200 &setdebuglist
, &showdebuglist
);
1202 /* Hook the BFD error/warning handler to limit amount of output. */
1203 default_bfd_error_handler
= bfd_set_error_handler (gdb_bfd_error_handler
);