1 /* Definitions for BFD wrappers used by GDB.
3 Copyright (C) 2011-2024 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/>. */
21 #include "event-top.h"
23 #include "cli/cli-cmds.h"
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>
37 #include "gdbsupport/unordered_set.h"
43 /* Lock held when doing BFD operations. A recursive mutex is used
44 because we use this mutex internally and also for BFD, just to make
45 life a bit simpler, and we may sometimes hold it while calling into
47 static std::recursive_mutex gdb_bfd_mutex
;
49 /* BFD locking function. */
52 gdb_bfd_lock (void *ignore
)
54 gdb_bfd_mutex
.lock ();
58 /* BFD unlocking function. */
61 gdb_bfd_unlock (void *ignore
)
63 gdb_bfd_mutex
.unlock ();
67 #endif /* CXX_STD_THREAD */
69 /* An object of this type is stored in the section's user data when
72 struct gdb_bfd_section_data
74 /* Size of the data. */
76 /* If the data was mmapped, this is the length of the map. */
78 /* The data. If NULL, the section data has not been read. */
80 /* If the data was mmapped, this is the map address. */
84 /* A hash set holding every BFD that gdb knows about. This is not
85 to be confused with 'gdb_bfd_cache', which is used for sharing
86 BFDs; in contrast, this hash is used just to implement
89 static gdb::unordered_set
<bfd
*> all_bfds
;
91 /* An object of this type is stored in each BFD's user data. */
95 /* Note that if ST is nullptr, then we simply fill in zeroes. */
96 gdb_bfd_data (bfd
*abfd
, struct stat
*st
)
97 : mtime (st
== nullptr ? 0 : st
->st_mtime
),
98 size (st
== nullptr ? 0 : st
->st_size
),
99 inode (st
== nullptr ? 0 : st
->st_ino
),
100 device_id (st
== nullptr ? 0 : st
->st_dev
),
101 relocation_computed (0),
102 needs_relocations (0),
111 /* The reference count. */
114 /* The mtime of the BFD at the point the cache entry was made. */
117 /* The file size (in bytes) at the point the cache entry was made. */
120 /* The inode of the file at the point the cache entry was made. */
123 /* The device id of the file at the point the cache entry was made. */
126 /* This is true if we have determined whether this BFD has any
127 sections requiring relocation. */
128 unsigned int relocation_computed
: 1;
130 /* This is true if any section needs relocation. */
131 unsigned int needs_relocations
: 1;
133 /* This is true if we have successfully computed the file's CRC. */
134 unsigned int crc_computed
: 1;
136 /* The file's CRC. */
137 unsigned long crc
= 0;
139 /* If the BFD comes from an archive, this points to the archive's
140 BFD. Otherwise, this is NULL. */
141 bfd
*archive_bfd
= nullptr;
143 /* Table of all the bfds this bfd has included. */
144 std::vector
<gdb_bfd_ref_ptr
> included_bfds
;
147 registry
<bfd
> registry_fields
;
150 /* Most of the locking needed for multi-threaded operation is
151 handled by BFD itself. However, the current BFD model is that
152 locking is only needed for global operations -- but it turned out
153 that the background DWARF reader could race with the auto-load
154 code reading the .debug_gdb_scripts section from the same BFD.
156 This lock is the fix: wrappers for important BFD functions will
157 acquire this lock before performing operations that might modify
158 the state of this BFD. */
159 std::mutex per_bfd_mutex
;
164 registry_accessor
<bfd
>::get (bfd
*abfd
)
166 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
167 return &gdata
->registry_fields
;
170 /* When true gdb will reuse an existing bfd object if the filename,
171 modification time, and file size all match. */
173 static bool bfd_sharing
= true;
175 show_bfd_sharing (struct ui_file
*file
, int from_tty
,
176 struct cmd_list_element
*c
, const char *value
)
178 gdb_printf (file
, _("BFD sharing is %s.\n"), value
);
181 /* When true debugging of the bfd caches is enabled. */
183 static bool debug_bfd_cache
;
185 /* Print an "bfd-cache" debug statement. */
187 #define bfd_cache_debug_printf(fmt, ...) \
188 debug_prefixed_printf_cond (debug_bfd_cache, "bfd-cache", fmt, ##__VA_ARGS__)
191 show_bfd_cache_debug (struct ui_file
*file
, int from_tty
,
192 struct cmd_list_element
*c
, const char *value
)
194 gdb_printf (file
, _("BFD cache debugging is %s.\n"), value
);
197 /* The type of an object being looked up in gdb_bfd_cache. We use
198 htab's capability of storing one kind of object (BFD in this case)
199 and using a different sort of object for searching. */
201 struct gdb_bfd_cache_search
204 const char *filename
;
207 /* The file size (in bytes). */
209 /* The inode of the file. */
211 /* The device id of the file. */
215 struct bfd_cache_hash
217 using is_transparent
= void;
219 std::size_t operator() (bfd
*abfd
) const noexcept
221 /* It is simplest to just hash the filename. */
222 return htab_hash_string (bfd_get_filename (abfd
));
225 std::size_t operator() (const gdb_bfd_cache_search
&search
) const noexcept
226 { return htab_hash_string (search
.filename
); }
231 using is_transparent
= void;
233 bool operator() (bfd
*lhs
, bfd
*rhs
) const noexcept
234 { return lhs
== rhs
; }
236 bool operator() (const gdb_bfd_cache_search
&s
, bfd
*abfd
) const noexcept
238 auto gdata
= static_cast<gdb_bfd_data
*> (bfd_usrdata (abfd
));
240 return (gdata
->mtime
== s
.mtime
241 && gdata
->size
== s
.size
242 && gdata
->inode
== s
.inode
243 && gdata
->device_id
== s
.device_id
244 && strcmp (bfd_get_filename (abfd
), s
.filename
) == 0);
248 /* A hash set storing all the BFDs maintained in the cache. */
250 static gdb::unordered_set
<bfd
*, bfd_cache_hash
, bfd_cache_eq
> gdb_bfd_cache
;
255 is_target_filename (const char *name
)
257 return startswith (name
, TARGET_SYSROOT_PREFIX
);
263 gdb_bfd_has_target_filename (struct bfd
*abfd
)
265 return is_target_filename (bfd_get_filename (abfd
));
268 /* For `gdb_bfd_open_from_target_memory`. An object that manages the
269 details of a BFD in target memory. */
271 struct target_buffer
: public gdb_bfd_iovec_base
273 /* Constructor. BASE and SIZE define where the BFD can be found in
275 target_buffer (CORE_ADDR base
, ULONGEST size
)
278 m_filename (xstrprintf ("<in-memory@%s-%s>",
279 core_addr_to_string_nz (m_base
),
280 core_addr_to_string_nz (m_base
+ m_size
)))
284 /* Return the size of the in-memory BFD file. */
285 ULONGEST
size () const
288 /* Return the base address of the in-memory BFD file. */
289 CORE_ADDR
base () const
292 /* Return a generated filename for the in-memory BFD file. The generated
293 name will include the begin and end address of the in-memory file. */
294 const char *filename () const
295 { return m_filename
.get (); }
297 file_ptr
read (bfd
*abfd
, void *buffer
, file_ptr nbytes
,
298 file_ptr offset
) override
;
300 int stat (struct bfd
*abfd
, struct stat
*sb
) override
;
303 /* The base address of the in-memory BFD file. */
306 /* The size (in-bytes) of the in-memory BFD file. */
309 /* Holds the generated name of the in-memory BFD file. */
310 gdb::unique_xmalloc_ptr
<char> m_filename
;
313 /* For `gdb_bfd_open_from_target_memory`. For reading the file, we just need to
314 pass through to target_read_memory and fix up the arguments and return
318 target_buffer::read (struct bfd
*abfd
, void *buf
,
319 file_ptr nbytes
, file_ptr offset
)
321 /* If this read will read all of the file, limit it to just the rest. */
322 if (offset
+ nbytes
> size ())
323 nbytes
= size () - offset
;
325 /* If there are no more bytes left, we've reached EOF. */
329 int err
= target_read_memory (base () + offset
, (gdb_byte
*) buf
, nbytes
);
336 /* For `gdb_bfd_open_from_target_memory`. For statting the file, we only
337 support the st_size attribute. */
340 target_buffer::stat (struct bfd
*abfd
, struct stat
*sb
)
342 memset (sb
, 0, sizeof (struct stat
));
343 sb
->st_size
= size ();
350 gdb_bfd_open_from_target_memory (CORE_ADDR addr
, ULONGEST size
,
353 std::unique_ptr
<target_buffer
> buffer
354 = std::make_unique
<target_buffer
> (addr
, size
);
356 return gdb_bfd_openr_iovec (buffer
->filename (), target
,
359 return buffer
.release ();
363 /* An object that manages the underlying stream for a BFD, using
366 struct target_fileio_stream
: public gdb_bfd_iovec_base
368 target_fileio_stream (bfd
*nbfd
, int fd
)
374 ~target_fileio_stream ();
376 file_ptr
read (bfd
*abfd
, void *buffer
, file_ptr nbytes
,
377 file_ptr offset
) override
;
379 int stat (struct bfd
*abfd
, struct stat
*sb
) override
;
383 /* The BFD. Saved for the destructor. */
386 /* The file descriptor. */
390 /* Wrapper for target_fileio_open suitable for use as a helper
391 function for gdb_bfd_openr_iovec. */
393 static target_fileio_stream
*
394 gdb_bfd_iovec_fileio_open (struct bfd
*abfd
, inferior
*inf
, bool warn_if_slow
)
396 const char *filename
= bfd_get_filename (abfd
);
398 fileio_error target_errno
;
400 gdb_assert (is_target_filename (filename
));
402 fd
= target_fileio_open (inf
,
403 filename
+ strlen (TARGET_SYSROOT_PREFIX
),
404 FILEIO_O_RDONLY
, 0, warn_if_slow
,
408 errno
= fileio_error_to_host (target_errno
);
409 bfd_set_error (bfd_error_system_call
);
413 return new target_fileio_stream (abfd
, fd
);
416 /* Wrapper for target_fileio_pread. */
419 target_fileio_stream::read (struct bfd
*abfd
, void *buf
,
420 file_ptr nbytes
, file_ptr offset
)
422 fileio_error target_errno
;
430 bytes
= target_fileio_pread (m_fd
, (gdb_byte
*) buf
+ pos
,
431 nbytes
- pos
, offset
+ pos
,
434 /* Success, but no bytes, means end-of-file. */
438 errno
= fileio_error_to_host (target_errno
);
439 bfd_set_error (bfd_error_system_call
);
449 /* Warn that it wasn't possible to close a bfd for file NAME, because
453 gdb_bfd_close_warning (const char *name
, const char *reason
)
455 warning (_("cannot close \"%s\": %s"), name
, reason
);
458 /* Wrapper for target_fileio_close. */
460 target_fileio_stream::~target_fileio_stream ()
462 fileio_error target_errno
;
464 /* Ignore errors on close. These may happen with remote
465 targets if the connection has already been torn down. */
468 target_fileio_close (m_fd
, &target_errno
);
470 catch (const gdb_exception
&ex
)
472 /* Also avoid crossing exceptions over bfd. */
473 gdb_bfd_close_warning (bfd_get_filename (m_bfd
),
474 ex
.message
->c_str ());
478 /* Wrapper for target_fileio_fstat. */
481 target_fileio_stream::stat (struct bfd
*abfd
, struct stat
*sb
)
483 fileio_error target_errno
;
486 result
= target_fileio_fstat (m_fd
, sb
, &target_errno
);
489 errno
= fileio_error_to_host (target_errno
);
490 bfd_set_error (bfd_error_system_call
);
496 /* A helper function to initialize the data that gdb attaches to each
500 gdb_bfd_init_data (struct bfd
*abfd
, struct stat
*st
)
502 struct gdb_bfd_data
*gdata
;
504 gdb_assert (bfd_usrdata (abfd
) == nullptr);
506 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
507 abfd
->flags
|= BFD_DECOMPRESS
;
509 gdata
= new gdb_bfd_data (abfd
, st
);
510 bfd_set_usrdata (abfd
, gdata
);
512 /* This is the first we've seen it, so add it to the hash table. */
513 bool inserted
= all_bfds
.emplace (abfd
).second
;
514 gdb_assert (inserted
);
520 gdb_bfd_open (const char *name
, const char *target
, int fd
,
526 if (is_target_filename (name
))
528 if (!target_filesystem_is_local ())
530 gdb_assert (fd
== -1);
532 auto open
= [&] (bfd
*nbfd
) -> gdb_bfd_iovec_base
*
534 return gdb_bfd_iovec_fileio_open (nbfd
, current_inferior (),
538 return gdb_bfd_openr_iovec (name
, target
, open
);
541 name
+= strlen (TARGET_SYSROOT_PREFIX
);
545 std::lock_guard
<std::recursive_mutex
> guard (gdb_bfd_mutex
);
550 fd
= gdb_open_cloexec (name
, O_RDONLY
| O_BINARY
, 0).release ();
553 bfd_set_error (bfd_error_system_call
);
558 if (fstat (fd
, &st
) < 0)
560 /* Weird situation here -- don't cache if we can't stat. */
561 bfd_cache_debug_printf ("Could not stat %s - not caching", name
);
562 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
565 return gdb_bfd_ref_ptr::new_reference (abfd
);
568 gdb_bfd_cache_search search
;
570 search
.filename
= name
;
571 search
.mtime
= st
.st_mtime
;
572 search
.size
= st
.st_size
;
573 search
.inode
= st
.st_ino
;
574 search
.device_id
= st
.st_dev
;
578 if (auto iter
= gdb_bfd_cache
.find (search
);
579 iter
!= gdb_bfd_cache
.end ())
582 bfd_cache_debug_printf ("Reusing cached bfd %s for %s",
583 host_address_to_string (abfd
),
584 bfd_get_filename (abfd
));
586 return gdb_bfd_ref_ptr::new_reference (abfd
);
590 abfd
= bfd_fopen (name
, target
, FOPEN_RB
, fd
);
594 bfd_set_cacheable (abfd
, 1);
596 bfd_cache_debug_printf ("Creating new bfd %s for %s",
597 host_address_to_string (abfd
),
598 bfd_get_filename (abfd
));
600 /* It's important to pass the already-computed stat info here,
601 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
602 default will "stat" the file each time bfd_get_mtime is called --
603 and since we will enter it into the hash table using this
604 mtime, if the file changed at the wrong moment, the race would
605 lead to a hash table corruption. */
606 gdb_bfd_init_data (abfd
, &st
);
610 bool inserted
= gdb_bfd_cache
.emplace (abfd
).second
;
611 gdb_assert (inserted
);
614 return gdb_bfd_ref_ptr (abfd
);
617 /* A helper function that releases any section data attached to the
621 free_one_bfd_section (asection
*sectp
)
623 struct gdb_bfd_section_data
*sect
624 = (struct gdb_bfd_section_data
*) bfd_section_userdata (sectp
);
626 if (sect
!= NULL
&& sect
->data
!= NULL
)
629 if (sect
->map_addr
!= NULL
)
633 res
= munmap (sect
->map_addr
, sect
->map_len
);
634 gdb_assert (res
== 0);
642 /* Close ABFD, and warn if that fails. */
645 gdb_bfd_close_or_warn (struct bfd
*abfd
)
648 gdb::unique_xmalloc_ptr
<char> name
649 = make_unique_xstrdup (bfd_get_filename (abfd
));
651 for (asection
*sect
: gdb_bfd_sections (abfd
))
652 free_one_bfd_section (sect
);
654 ret
= bfd_close (abfd
);
657 gdb_bfd_close_warning (name
.get (),
658 bfd_errmsg (bfd_get_error ()));
666 gdb_bfd_ref (struct bfd
*abfd
)
668 struct gdb_bfd_data
*gdata
;
674 std::lock_guard
<std::recursive_mutex
> guard (gdb_bfd_mutex
);
677 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
679 bfd_cache_debug_printf ("Increase reference count on bfd %s (%s)",
680 host_address_to_string (abfd
),
681 bfd_get_filename (abfd
));
689 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
691 gdb_bfd_init_data (abfd
, nullptr);
697 gdb_bfd_unref (struct bfd
*abfd
)
699 struct gdb_bfd_data
*gdata
;
706 std::lock_guard
<std::recursive_mutex
> guard (gdb_bfd_mutex
);
709 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
710 gdb_assert (gdata
->refc
>= 1);
715 bfd_cache_debug_printf ("Decrease reference count on bfd %s (%s)",
716 host_address_to_string (abfd
),
717 bfd_get_filename (abfd
));
721 bfd_cache_debug_printf ("Delete final reference count on bfd %s (%s)",
722 host_address_to_string (abfd
),
723 bfd_get_filename (abfd
));
725 archive_bfd
= gdata
->archive_bfd
;
727 if (bfd_get_filename (abfd
) != nullptr)
728 gdb_bfd_cache
.erase (abfd
);
731 bfd_set_usrdata (abfd
, NULL
); /* Paranoia. */
733 all_bfds
.erase (abfd
);
735 gdb_bfd_close_or_warn (abfd
);
737 gdb_bfd_unref (archive_bfd
);
740 /* A helper function that returns the section data descriptor
741 associated with SECTION. If no such descriptor exists, a new one
742 is allocated and cleared. */
744 static struct gdb_bfd_section_data
*
745 get_section_descriptor (asection
*section
)
747 struct gdb_bfd_section_data
*result
;
749 result
= (struct gdb_bfd_section_data
*) bfd_section_userdata (section
);
753 result
= ((struct gdb_bfd_section_data
*)
754 bfd_zalloc (section
->owner
, sizeof (*result
)));
755 bfd_set_section_userdata (section
, result
);
764 gdb_bfd_map_section (asection
*sectp
, bfd_size_type
*size
)
767 struct gdb_bfd_section_data
*descriptor
;
770 gdb_assert ((sectp
->flags
& SEC_RELOC
) == 0);
771 gdb_assert (size
!= NULL
);
776 gdb_bfd_data
*gdata
= (gdb_bfd_data
*) bfd_usrdata (abfd
);
777 std::lock_guard
<std::mutex
> guard (gdata
->per_bfd_mutex
);
780 descriptor
= get_section_descriptor (sectp
);
782 /* If the data was already read for this BFD, just reuse it. */
783 if (descriptor
->data
!= NULL
)
787 if (!bfd_is_section_compressed (abfd
, sectp
))
789 /* The page size, used when mmapping. */
793 pagesize
= getpagesize ();
795 /* Only try to mmap sections which are large enough: we don't want
796 to waste space due to fragmentation. */
798 if (bfd_section_size (sectp
) > 4 * pagesize
)
800 descriptor
->size
= bfd_section_size (sectp
);
801 descriptor
->data
= bfd_mmap (abfd
, 0, descriptor
->size
, PROT_READ
,
802 MAP_PRIVATE
, sectp
->filepos
,
803 &descriptor
->map_addr
,
804 &descriptor
->map_len
);
806 if ((caddr_t
)descriptor
->data
!= MAP_FAILED
)
808 #if HAVE_POSIX_MADVISE
809 posix_madvise (descriptor
->map_addr
, descriptor
->map_len
,
810 POSIX_MADV_WILLNEED
);
815 /* On failure, clear out the section data and try again. */
816 memset (descriptor
, 0, sizeof (*descriptor
));
819 #endif /* HAVE_MMAP */
821 /* Handle compressed sections, or ordinary uncompressed sections in
824 descriptor
->size
= bfd_section_size (sectp
);
825 descriptor
->data
= NULL
;
828 if (!bfd_get_full_section_contents (abfd
, sectp
, &data
))
830 warning (_("Can't read data for section '%s' in file '%s'"),
831 bfd_section_name (sectp
),
832 bfd_get_filename (abfd
));
833 /* Set size to 0 to prevent further attempts to read the invalid
838 descriptor
->data
= data
;
841 gdb_assert (descriptor
->data
!= NULL
);
842 *size
= descriptor
->size
;
843 return (const gdb_byte
*) descriptor
->data
;
846 /* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
847 return 1. Otherwise print a warning and return 0. ABFD seek position is
851 get_file_crc (bfd
*abfd
, unsigned long *file_crc_return
)
853 uint32_t file_crc
= 0;
855 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
857 warning (_("Problem reading \"%s\" for CRC: %s"),
858 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
864 gdb_byte buffer
[8 * 1024];
867 count
= bfd_read (buffer
, sizeof (buffer
), abfd
);
868 if (count
== (bfd_size_type
) -1)
870 warning (_("Problem reading \"%s\" for CRC: %s"),
871 bfd_get_filename (abfd
), bfd_errmsg (bfd_get_error ()));
876 file_crc
= bfd_calc_gnu_debuglink_crc32 (file_crc
, buffer
, count
);
879 *file_crc_return
= file_crc
;
886 gdb_bfd_crc (struct bfd
*abfd
, unsigned long *crc_out
)
888 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
890 if (!gdata
->crc_computed
)
891 gdata
->crc_computed
= get_file_crc (abfd
, &gdata
->crc
);
893 if (gdata
->crc_computed
)
894 *crc_out
= gdata
->crc
;
895 return gdata
->crc_computed
;
903 gdb_bfd_fopen (const char *filename
, const char *target
, const char *mode
,
906 bfd
*result
= bfd_fopen (filename
, target
, mode
, fd
);
908 if (result
!= nullptr)
909 bfd_set_cacheable (result
, 1);
911 return gdb_bfd_ref_ptr::new_reference (result
);
917 gdb_bfd_openr (const char *filename
, const char *target
)
919 bfd
*result
= bfd_openr (filename
, target
);
921 return gdb_bfd_ref_ptr::new_reference (result
);
927 gdb_bfd_openw (const char *filename
, const char *target
)
929 bfd
*result
= bfd_openw (filename
, target
);
931 return gdb_bfd_ref_ptr::new_reference (result
);
937 gdb_bfd_openr_iovec (const char *filename
, const char *target
,
938 gdb_iovec_opener_ftype open_fn
)
940 auto do_open
= [] (bfd
*nbfd
, void *closure
) -> void *
942 auto real_opener
= static_cast<gdb_iovec_opener_ftype
*> (closure
);
943 /* Prevent exceptions from escaping to C code and triggering an abort. */
944 auto res
= catch_exceptions
<gdb_bfd_iovec_base
*, nullptr> ([&]
946 return (*real_opener
) (nbfd
);
951 bfd_set_error (bfd_error_system_call
);
956 auto read_trampoline
= [] (bfd
*nbfd
, void *stream
, void *buf
,
957 file_ptr nbytes
, file_ptr offset
) -> file_ptr
959 gdb_bfd_iovec_base
*obj
= static_cast<gdb_bfd_iovec_base
*> (stream
);
960 /* Prevent exceptions from escaping to C code and triggering an abort. */
961 auto res
= catch_exceptions
<long int, -1> ([&]
963 return obj
->read (nbfd
, buf
, nbytes
, offset
);
968 bfd_set_error (bfd_error_system_call
);
973 auto stat_trampoline
= [] (struct bfd
*abfd
, void *stream
,
974 struct stat
*sb
) -> int
976 gdb_bfd_iovec_base
*obj
= static_cast<gdb_bfd_iovec_base
*> (stream
);
977 /* Prevent exceptions from escaping to C code and triggering an abort. */
978 auto res
= catch_exceptions
<int, -1> ([&]
980 return obj
->stat (abfd
, sb
);
985 bfd_set_error (bfd_error_system_call
);
990 auto close_trampoline
= [] (struct bfd
*nbfd
, void *stream
) -> int
992 gdb_bfd_iovec_base
*obj
= static_cast<gdb_bfd_iovec_base
*> (stream
);
998 bfd
*result
= bfd_openr_iovec (filename
, target
,
1000 read_trampoline
, close_trampoline
,
1003 return gdb_bfd_ref_ptr::new_reference (result
);
1006 /* See gdb_bfd.h. */
1009 gdb_bfd_mark_parent (bfd
*child
, bfd
*parent
)
1011 struct gdb_bfd_data
*gdata
;
1013 gdb_bfd_ref (child
);
1014 /* No need to stash the filename here, because we also keep a
1015 reference on the parent archive. */
1017 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (child
);
1018 if (gdata
->archive_bfd
== NULL
)
1020 gdata
->archive_bfd
= parent
;
1021 gdb_bfd_ref (parent
);
1024 gdb_assert (gdata
->archive_bfd
== parent
);
1027 /* See gdb_bfd.h. */
1030 gdb_bfd_openr_next_archived_file (bfd
*archive
, bfd
*previous
)
1032 bfd
*result
= bfd_openr_next_archived_file (archive
, previous
);
1035 gdb_bfd_mark_parent (result
, archive
);
1037 return gdb_bfd_ref_ptr (result
);
1040 /* See gdb_bfd.h. */
1043 gdb_bfd_record_inclusion (bfd
*includer
, bfd
*includee
)
1045 struct gdb_bfd_data
*gdata
;
1047 gdata
= (struct gdb_bfd_data
*) bfd_usrdata (includer
);
1048 gdata
->included_bfds
.push_back (gdb_bfd_ref_ptr::new_reference (includee
));
1053 static_assert (ARRAY_SIZE (_bfd_std_section
) == 4);
1055 /* See gdb_bfd.h. */
1058 gdb_bfd_section_index (bfd
*abfd
, asection
*section
)
1060 if (section
== NULL
)
1062 else if (section
== bfd_com_section_ptr
)
1063 return bfd_count_sections (abfd
);
1064 else if (section
== bfd_und_section_ptr
)
1065 return bfd_count_sections (abfd
) + 1;
1066 else if (section
== bfd_abs_section_ptr
)
1067 return bfd_count_sections (abfd
) + 2;
1068 else if (section
== bfd_ind_section_ptr
)
1069 return bfd_count_sections (abfd
) + 3;
1070 return section
->index
;
1073 /* See gdb_bfd.h. */
1076 gdb_bfd_count_sections (bfd
*abfd
)
1078 return bfd_count_sections (abfd
) + 4;
1081 /* See gdb_bfd.h. */
1084 gdb_bfd_requires_relocations (bfd
*abfd
)
1086 struct gdb_bfd_data
*gdata
= (struct gdb_bfd_data
*) bfd_usrdata (abfd
);
1088 if (gdata
->relocation_computed
== 0)
1092 for (sect
= abfd
->sections
; sect
!= NULL
; sect
= sect
->next
)
1093 if ((sect
->flags
& SEC_RELOC
) != 0)
1095 gdata
->needs_relocations
= 1;
1099 gdata
->relocation_computed
= 1;
1102 return gdata
->needs_relocations
;
1105 /* See gdb_bfd.h. */
1108 gdb_bfd_get_full_section_contents (bfd
*abfd
, asection
*section
,
1109 gdb::byte_vector
*contents
)
1112 gdb_bfd_data
*gdata
= (gdb_bfd_data
*) bfd_usrdata (abfd
);
1113 std::lock_guard
<std::mutex
> guard (gdata
->per_bfd_mutex
);
1116 bfd_size_type section_size
= bfd_section_size (section
);
1118 contents
->resize (section_size
);
1120 return bfd_get_section_contents (abfd
, section
, contents
->data (), 0,
1124 /* See gdb_bfd.h. */
1127 gdb_bfd_stat (bfd
*abfd
, struct stat
*sbuf
)
1130 gdb_bfd_data
*gdata
= (gdb_bfd_data
*) bfd_usrdata (abfd
);
1131 std::lock_guard
<std::mutex
> guard (gdata
->per_bfd_mutex
);
1134 return bfd_stat (abfd
, sbuf
);
1137 /* See gdb_bfd.h. */
1140 gdb_bfd_get_mtime (bfd
*abfd
)
1143 gdb_bfd_data
*gdata
= (gdb_bfd_data
*) bfd_usrdata (abfd
);
1144 std::lock_guard
<std::mutex
> guard (gdata
->per_bfd_mutex
);
1147 return bfd_get_mtime (abfd
);
1150 #define AMBIGUOUS_MESS1 ".\nMatching formats:"
1151 #define AMBIGUOUS_MESS2 \
1152 ".\nUse \"set gnutarget format-name\" to specify the format."
1154 /* See gdb_bfd.h. */
1157 gdb_bfd_errmsg (bfd_error_type error_tag
, char **matching
)
1161 /* Check if errmsg just need simple return. */
1162 if (error_tag
!= bfd_error_file_ambiguously_recognized
|| matching
== NULL
)
1163 return bfd_errmsg (error_tag
);
1165 std::string
ret (bfd_errmsg (error_tag
));
1166 ret
+= AMBIGUOUS_MESS1
;
1168 for (p
= matching
; *p
; p
++)
1173 ret
+= AMBIGUOUS_MESS2
;
1180 /* Implement the 'maint info bfd' command. */
1183 maintenance_info_bfds (const char *arg
, int from_tty
)
1185 struct ui_out
*uiout
= current_uiout
;
1187 ui_out_emit_table
table_emitter (uiout
, 3, -1, "bfds");
1188 uiout
->table_header (10, ui_left
, "refcount", "Refcount");
1189 uiout
->table_header (18, ui_left
, "addr", "Address");
1190 uiout
->table_header (40, ui_left
, "filename", "Filename");
1192 uiout
->table_body ();
1194 for (auto abfd
: all_bfds
)
1196 auto gdata
= static_cast<gdb_bfd_data
*> (bfd_usrdata (abfd
));
1197 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
1198 uiout
->field_signed ("refcount", gdata
->refc
);
1199 uiout
->field_string ("addr", host_address_to_string (abfd
));
1200 uiout
->field_string ("filename", bfd_get_filename (abfd
),
1201 file_name_style
.style ());
1206 /* BFD related per-inferior data. */
1208 struct bfd_inferior_data
1210 std::unordered_map
<std::string
, unsigned long> bfd_error_string_counts
;
1213 /* Per-inferior data key. */
1215 static const registry
<inferior
>::key
<bfd_inferior_data
> bfd_inferior_data_key
;
1217 /* Fetch per-inferior BFD data. It always returns a valid pointer to
1218 a bfd_inferior_data struct. */
1220 static struct bfd_inferior_data
*
1221 get_bfd_inferior_data (struct inferior
*inf
)
1223 struct bfd_inferior_data
*data
;
1225 data
= bfd_inferior_data_key
.get (inf
);
1226 if (data
== nullptr)
1227 data
= bfd_inferior_data_key
.emplace (inf
);
1232 /* Increment the BFD error count for STR and return the updated
1235 static unsigned long
1236 increment_bfd_error_count (const std::string
&str
)
1239 std::lock_guard
<std::recursive_mutex
> guard (gdb_bfd_mutex
);
1241 struct bfd_inferior_data
*bid
= get_bfd_inferior_data (current_inferior ());
1243 auto &map
= bid
->bfd_error_string_counts
;
1247 /* A print callback for bfd_print_error. */
1249 static int ATTRIBUTE_PRINTF (2, 0)
1250 print_error_callback (void *stream
, const char *fmt
, ...)
1252 string_file
*file
= (string_file
*) stream
;
1253 size_t in_size
= file
->size ();
1256 file
->vprintf (fmt
, ap
);
1258 return file
->size () - in_size
;
1261 /* Define a BFD error handler which will suppress the printing of
1262 messages which have been printed once already. This is done on a
1263 per-inferior basis. */
1266 gdb_bfd_error_handler (const char *fmt
, va_list ap
)
1269 bfd_print_error (print_error_callback
, &output
, fmt
, ap
);
1270 std::string str
= output
.release ();
1272 if (increment_bfd_error_count (str
) > 1)
1275 warning ("%s", str
.c_str ());
1278 /* See gdb_bfd.h. */
1283 if (bfd_init () == BFD_INIT_MAGIC
)
1286 if (bfd_thread_init (gdb_bfd_lock
, gdb_bfd_unlock
, nullptr))
1291 error (_("fatal error: libbfd ABI mismatch"));
1294 void _initialize_gdb_bfd ();
1296 _initialize_gdb_bfd ()
1298 add_cmd ("bfds", class_maintenance
, maintenance_info_bfds
, _("\
1299 List the BFDs that are currently open."),
1300 &maintenanceinfolist
);
1302 add_setshow_boolean_cmd ("bfd-sharing", no_class
,
1304 Set whether gdb will share bfds that appear to be the same file."), _("\
1305 Show whether gdb will share bfds that appear to be the same file."), _("\
1306 When enabled gdb will reuse existing bfds rather than reopening the\n\
1307 same file. To decide if two files are the same then gdb compares the\n\
1308 filename, file size, file modification time, and file inode."),
1311 &maintenance_set_cmdlist
,
1312 &maintenance_show_cmdlist
);
1314 add_setshow_boolean_cmd ("bfd-cache", class_maintenance
,
1316 _("Set bfd cache debugging."),
1317 _("Show bfd cache debugging."),
1319 When non-zero, bfd cache specific debugging is enabled."),
1321 &show_bfd_cache_debug
,
1322 &setdebuglist
, &showdebuglist
);
1324 /* Hook the BFD error/warning handler to limit amount of output. */
1325 bfd_set_error_handler (gdb_bfd_error_handler
);