RISC-V: Don't report warnings when linking different privileged spec objects.
[binutils-gdb.git] / gdb / gdb_bfd.c
blob330d91828034de9a401a2af271c0265502fb8fcf
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/>. */
20 #include "gdb_bfd.h"
21 #include "event-top.h"
22 #include "ui-out.h"
23 #include "cli/cli-cmds.h"
24 #include "hashtab.h"
25 #include "gdbsupport/filestuff.h"
26 #ifdef HAVE_MMAP
27 #include <sys/mman.h>
28 #ifndef MAP_FAILED
29 #define MAP_FAILED ((void *) -1)
30 #endif
31 #endif
32 #include "target.h"
33 #include "gdbsupport/fileio.h"
34 #include "inferior.h"
35 #include "cli/cli-style.h"
36 #include <unordered_map>
38 #if CXX_STD_THREAD
40 #include <mutex>
42 /* Lock held when doing BFD operations. A recursive mutex is used
43 because we use this mutex internally and also for BFD, just to make
44 life a bit simpler, and we may sometimes hold it while calling into
45 BFD. */
46 static std::recursive_mutex gdb_bfd_mutex;
48 /* BFD locking function. */
50 static bool
51 gdb_bfd_lock (void *ignore)
53 gdb_bfd_mutex.lock ();
54 return true;
57 /* BFD unlocking function. */
59 static bool
60 gdb_bfd_unlock (void *ignore)
62 gdb_bfd_mutex.unlock ();
63 return true;
66 #endif /* CXX_STD_THREAD */
68 /* An object of this type is stored in the section's user data when
69 mapping a section. */
71 struct gdb_bfd_section_data
73 /* Size of the data. */
74 size_t size;
75 /* If the data was mmapped, this is the length of the map. */
76 size_t map_len;
77 /* The data. If NULL, the section data has not been read. */
78 void *data;
79 /* If the data was mmapped, this is the map address. */
80 void *map_addr;
83 /* A hash table holding every BFD that gdb knows about. This is not
84 to be confused with 'gdb_bfd_cache', which is used for sharing
85 BFDs; in contrast, this hash is used just to implement
86 "maint info bfd". */
88 static htab_t all_bfds;
90 /* An object of this type is stored in each BFD's user data. */
92 struct gdb_bfd_data
94 /* Note that if ST is nullptr, then we simply fill in zeroes. */
95 gdb_bfd_data (bfd *abfd, struct stat *st)
96 : mtime (st == nullptr ? 0 : st->st_mtime),
97 size (st == nullptr ? 0 : st->st_size),
98 inode (st == nullptr ? 0 : st->st_ino),
99 device_id (st == nullptr ? 0 : st->st_dev),
100 relocation_computed (0),
101 needs_relocations (0),
102 crc_computed (0)
106 ~gdb_bfd_data ()
110 /* The reference count. */
111 int refc = 1;
113 /* The mtime of the BFD at the point the cache entry was made. */
114 time_t mtime;
116 /* The file size (in bytes) at the point the cache entry was made. */
117 off_t size;
119 /* The inode of the file at the point the cache entry was made. */
120 ino_t inode;
122 /* The device id of the file at the point the cache entry was made. */
123 dev_t device_id;
125 /* This is true if we have determined whether this BFD has any
126 sections requiring relocation. */
127 unsigned int relocation_computed : 1;
129 /* This is true if any section needs relocation. */
130 unsigned int needs_relocations : 1;
132 /* This is true if we have successfully computed the file's CRC. */
133 unsigned int crc_computed : 1;
135 /* The file's CRC. */
136 unsigned long crc = 0;
138 /* If the BFD comes from an archive, this points to the archive's
139 BFD. Otherwise, this is NULL. */
140 bfd *archive_bfd = nullptr;
142 /* Table of all the bfds this bfd has included. */
143 std::vector<gdb_bfd_ref_ptr> included_bfds;
145 /* The registry. */
146 registry<bfd> registry_fields;
148 #if CXX_STD_THREAD
149 /* Most of the locking needed for multi-threaded operation is
150 handled by BFD itself. However, the current BFD model is that
151 locking is only needed for global operations -- but it turned out
152 that the background DWARF reader could race with the auto-load
153 code reading the .debug_gdb_scripts section from the same BFD.
155 This lock is the fix: wrappers for important BFD functions will
156 acquire this lock before performing operations that might modify
157 the state of this BFD. */
158 std::mutex per_bfd_mutex;
159 #endif
162 registry<bfd> *
163 registry_accessor<bfd>::get (bfd *abfd)
165 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
166 return &gdata->registry_fields;
169 /* A hash table storing all the BFDs maintained in the cache. */
171 static htab_t gdb_bfd_cache;
173 /* When true gdb will reuse an existing bfd object if the filename,
174 modification time, and file size all match. */
176 static bool bfd_sharing = true;
177 static void
178 show_bfd_sharing (struct ui_file *file, int from_tty,
179 struct cmd_list_element *c, const char *value)
181 gdb_printf (file, _("BFD sharing is %s.\n"), value);
184 /* When true debugging of the bfd caches is enabled. */
186 static bool debug_bfd_cache;
188 /* Print an "bfd-cache" debug statement. */
190 #define bfd_cache_debug_printf(fmt, ...) \
191 debug_prefixed_printf_cond (debug_bfd_cache, "bfd-cache", fmt, ##__VA_ARGS__)
193 static void
194 show_bfd_cache_debug (struct ui_file *file, int from_tty,
195 struct cmd_list_element *c, const char *value)
197 gdb_printf (file, _("BFD cache debugging is %s.\n"), value);
200 /* The type of an object being looked up in gdb_bfd_cache. We use
201 htab's capability of storing one kind of object (BFD in this case)
202 and using a different sort of object for searching. */
204 struct gdb_bfd_cache_search
206 /* The filename. */
207 const char *filename;
208 /* The mtime. */
209 time_t mtime;
210 /* The file size (in bytes). */
211 off_t size;
212 /* The inode of the file. */
213 ino_t inode;
214 /* The device id of the file. */
215 dev_t device_id;
218 /* A hash function for BFDs. */
220 static hashval_t
221 hash_bfd (const void *b)
223 const bfd *abfd = (const struct bfd *) b;
225 /* It is simplest to just hash the filename. */
226 return htab_hash_string (bfd_get_filename (abfd));
229 /* An equality function for BFDs. Note that this expects the caller
230 to search using struct gdb_bfd_cache_search only, not BFDs. */
232 static int
233 eq_bfd (const void *a, const void *b)
235 const bfd *abfd = (const struct bfd *) a;
236 const struct gdb_bfd_cache_search *s
237 = (const struct gdb_bfd_cache_search *) b;
238 struct gdb_bfd_data *gdata = (struct 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);
247 /* See gdb_bfd.h. */
250 is_target_filename (const char *name)
252 return startswith (name, TARGET_SYSROOT_PREFIX);
255 /* See gdb_bfd.h. */
258 gdb_bfd_has_target_filename (struct bfd *abfd)
260 return is_target_filename (bfd_get_filename (abfd));
263 /* For `gdb_bfd_open_from_target_memory`. An object that manages the
264 details of a BFD in target memory. */
266 struct target_buffer : public gdb_bfd_iovec_base
268 /* Constructor. BASE and SIZE define where the BFD can be found in
269 target memory. */
270 target_buffer (CORE_ADDR base, ULONGEST size)
271 : m_base (base),
272 m_size (size),
273 m_filename (xstrprintf ("<in-memory@%s-%s>",
274 core_addr_to_string_nz (m_base),
275 core_addr_to_string_nz (m_base + m_size)))
279 /* Return the size of the in-memory BFD file. */
280 ULONGEST size () const
281 { return m_size; }
283 /* Return the base address of the in-memory BFD file. */
284 CORE_ADDR base () const
285 { return m_base; }
287 /* Return a generated filename for the in-memory BFD file. The generated
288 name will include the begin and end address of the in-memory file. */
289 const char *filename () const
290 { return m_filename.get (); }
292 file_ptr read (bfd *abfd, void *buffer, file_ptr nbytes,
293 file_ptr offset) override;
295 int stat (struct bfd *abfd, struct stat *sb) override;
297 private:
298 /* The base address of the in-memory BFD file. */
299 CORE_ADDR m_base;
301 /* The size (in-bytes) of the in-memory BFD file. */
302 ULONGEST m_size;
304 /* Holds the generated name of the in-memory BFD file. */
305 gdb::unique_xmalloc_ptr<char> m_filename;
308 /* For `gdb_bfd_open_from_target_memory`. For reading the file, we just need to
309 pass through to target_read_memory and fix up the arguments and return
310 values. */
312 file_ptr
313 target_buffer::read (struct bfd *abfd, void *buf,
314 file_ptr nbytes, file_ptr offset)
316 /* If this read will read all of the file, limit it to just the rest. */
317 if (offset + nbytes > size ())
318 nbytes = size () - offset;
320 /* If there are no more bytes left, we've reached EOF. */
321 if (nbytes == 0)
322 return 0;
324 int err = target_read_memory (base () + offset, (gdb_byte *) buf, nbytes);
325 if (err)
326 return -1;
328 return nbytes;
331 /* For `gdb_bfd_open_from_target_memory`. For statting the file, we only
332 support the st_size attribute. */
335 target_buffer::stat (struct bfd *abfd, struct stat *sb)
337 memset (sb, 0, sizeof (struct stat));
338 sb->st_size = size ();
339 return 0;
342 /* See gdb_bfd.h. */
344 gdb_bfd_ref_ptr
345 gdb_bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
346 const char *target)
348 std::unique_ptr<target_buffer> buffer
349 = std::make_unique<target_buffer> (addr, size);
351 return gdb_bfd_openr_iovec (buffer->filename (), target,
352 [&] (bfd *nbfd)
354 return buffer.release ();
358 /* An object that manages the underlying stream for a BFD, using
359 target file I/O. */
361 struct target_fileio_stream : public gdb_bfd_iovec_base
363 target_fileio_stream (bfd *nbfd, int fd)
364 : m_bfd (nbfd),
365 m_fd (fd)
369 ~target_fileio_stream ();
371 file_ptr read (bfd *abfd, void *buffer, file_ptr nbytes,
372 file_ptr offset) override;
374 int stat (struct bfd *abfd, struct stat *sb) override;
376 private:
378 /* The BFD. Saved for the destructor. */
379 bfd *m_bfd;
381 /* The file descriptor. */
382 int m_fd;
385 /* Wrapper for target_fileio_open suitable for use as a helper
386 function for gdb_bfd_openr_iovec. */
388 static target_fileio_stream *
389 gdb_bfd_iovec_fileio_open (struct bfd *abfd, inferior *inf, bool warn_if_slow)
391 const char *filename = bfd_get_filename (abfd);
392 int fd;
393 fileio_error target_errno;
395 gdb_assert (is_target_filename (filename));
397 fd = target_fileio_open (inf,
398 filename + strlen (TARGET_SYSROOT_PREFIX),
399 FILEIO_O_RDONLY, 0, warn_if_slow,
400 &target_errno);
401 if (fd == -1)
403 errno = fileio_error_to_host (target_errno);
404 bfd_set_error (bfd_error_system_call);
405 return NULL;
408 return new target_fileio_stream (abfd, fd);
411 /* Wrapper for target_fileio_pread. */
413 file_ptr
414 target_fileio_stream::read (struct bfd *abfd, void *buf,
415 file_ptr nbytes, file_ptr offset)
417 fileio_error target_errno;
418 file_ptr pos, bytes;
420 pos = 0;
421 while (nbytes > pos)
423 QUIT;
425 bytes = target_fileio_pread (m_fd, (gdb_byte *) buf + pos,
426 nbytes - pos, offset + pos,
427 &target_errno);
428 if (bytes == 0)
429 /* Success, but no bytes, means end-of-file. */
430 break;
431 if (bytes == -1)
433 errno = fileio_error_to_host (target_errno);
434 bfd_set_error (bfd_error_system_call);
435 return -1;
438 pos += bytes;
441 return pos;
444 /* Warn that it wasn't possible to close a bfd for file NAME, because
445 of REASON. */
447 static void
448 gdb_bfd_close_warning (const char *name, const char *reason)
450 warning (_("cannot close \"%s\": %s"), name, reason);
453 /* Wrapper for target_fileio_close. */
455 target_fileio_stream::~target_fileio_stream ()
457 fileio_error target_errno;
459 /* Ignore errors on close. These may happen with remote
460 targets if the connection has already been torn down. */
463 target_fileio_close (m_fd, &target_errno);
465 catch (const gdb_exception &ex)
467 /* Also avoid crossing exceptions over bfd. */
468 gdb_bfd_close_warning (bfd_get_filename (m_bfd),
469 ex.message->c_str ());
473 /* Wrapper for target_fileio_fstat. */
476 target_fileio_stream::stat (struct bfd *abfd, struct stat *sb)
478 fileio_error target_errno;
479 int result;
481 result = target_fileio_fstat (m_fd, sb, &target_errno);
482 if (result == -1)
484 errno = fileio_error_to_host (target_errno);
485 bfd_set_error (bfd_error_system_call);
488 return result;
491 /* A helper function to initialize the data that gdb attaches to each
492 BFD. */
494 static void
495 gdb_bfd_init_data (struct bfd *abfd, struct stat *st)
497 struct gdb_bfd_data *gdata;
498 void **slot;
500 gdb_assert (bfd_usrdata (abfd) == nullptr);
502 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
503 abfd->flags |= BFD_DECOMPRESS;
505 gdata = new gdb_bfd_data (abfd, st);
506 bfd_set_usrdata (abfd, gdata);
508 /* This is the first we've seen it, so add it to the hash table. */
509 slot = htab_find_slot (all_bfds, abfd, INSERT);
510 gdb_assert (slot && !*slot);
511 *slot = abfd;
514 /* See gdb_bfd.h. */
516 gdb_bfd_ref_ptr
517 gdb_bfd_open (const char *name, const char *target, int fd,
518 bool warn_if_slow)
520 hashval_t hash;
521 void **slot;
522 bfd *abfd;
523 struct gdb_bfd_cache_search search;
524 struct stat st;
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 (),
535 warn_if_slow);
538 return gdb_bfd_openr_iovec (name, target, open);
541 name += strlen (TARGET_SYSROOT_PREFIX);
544 #if CXX_STD_THREAD
545 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
546 #endif
548 if (gdb_bfd_cache == NULL)
549 gdb_bfd_cache = htab_create_alloc (1, hash_bfd, eq_bfd, NULL,
550 xcalloc, xfree);
552 if (fd == -1)
554 fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0).release ();
555 if (fd == -1)
557 bfd_set_error (bfd_error_system_call);
558 return NULL;
562 if (fstat (fd, &st) < 0)
564 /* Weird situation here -- don't cache if we can't stat. */
565 bfd_cache_debug_printf ("Could not stat %s - not caching", name);
566 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
567 if (abfd == nullptr)
568 return nullptr;
569 return gdb_bfd_ref_ptr::new_reference (abfd);
572 search.filename = name;
573 search.mtime = st.st_mtime;
574 search.size = st.st_size;
575 search.inode = st.st_ino;
576 search.device_id = st.st_dev;
578 /* Note that this must compute the same result as hash_bfd. */
579 hash = htab_hash_string (name);
580 /* Note that we cannot use htab_find_slot_with_hash here, because
581 opening the BFD may fail; and this would violate hashtab
582 invariants. */
583 abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
584 if (bfd_sharing && abfd != NULL)
586 bfd_cache_debug_printf ("Reusing cached bfd %s for %s",
587 host_address_to_string (abfd),
588 bfd_get_filename (abfd));
589 close (fd);
590 return gdb_bfd_ref_ptr::new_reference (abfd);
593 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
594 if (abfd == NULL)
595 return NULL;
597 bfd_set_cacheable (abfd, 1);
599 bfd_cache_debug_printf ("Creating new bfd %s for %s",
600 host_address_to_string (abfd),
601 bfd_get_filename (abfd));
603 /* It's important to pass the already-computed stat info here,
604 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
605 default will "stat" the file each time bfd_get_mtime is called --
606 and since we will enter it into the hash table using this
607 mtime, if the file changed at the wrong moment, the race would
608 lead to a hash table corruption. */
609 gdb_bfd_init_data (abfd, &st);
611 if (bfd_sharing)
613 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
614 gdb_assert (!*slot);
615 *slot = abfd;
618 return gdb_bfd_ref_ptr (abfd);
621 /* A helper function that releases any section data attached to the
622 BFD. */
624 static void
625 free_one_bfd_section (asection *sectp)
627 struct gdb_bfd_section_data *sect
628 = (struct gdb_bfd_section_data *) bfd_section_userdata (sectp);
630 if (sect != NULL && sect->data != NULL)
632 #ifdef HAVE_MMAP
633 if (sect->map_addr != NULL)
635 int res;
637 res = munmap (sect->map_addr, sect->map_len);
638 gdb_assert (res == 0);
640 else
641 #endif
642 xfree (sect->data);
646 /* Close ABFD, and warn if that fails. */
648 static int
649 gdb_bfd_close_or_warn (struct bfd *abfd)
651 int ret;
652 gdb::unique_xmalloc_ptr<char> name
653 = make_unique_xstrdup (bfd_get_filename (abfd));
655 for (asection *sect : gdb_bfd_sections (abfd))
656 free_one_bfd_section (sect);
658 ret = bfd_close (abfd);
660 if (!ret)
661 gdb_bfd_close_warning (name.get (),
662 bfd_errmsg (bfd_get_error ()));
664 return ret;
667 /* See gdb_bfd.h. */
669 void
670 gdb_bfd_ref (struct bfd *abfd)
672 struct gdb_bfd_data *gdata;
674 if (abfd == NULL)
675 return;
677 #if CXX_STD_THREAD
678 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
679 #endif
681 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
683 bfd_cache_debug_printf ("Increase reference count on bfd %s (%s)",
684 host_address_to_string (abfd),
685 bfd_get_filename (abfd));
687 if (gdata != NULL)
689 gdata->refc += 1;
690 return;
693 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
694 fine. */
695 gdb_bfd_init_data (abfd, nullptr);
698 /* See gdb_bfd.h. */
700 void
701 gdb_bfd_unref (struct bfd *abfd)
703 struct gdb_bfd_data *gdata;
704 struct gdb_bfd_cache_search search;
705 bfd *archive_bfd;
707 if (abfd == NULL)
708 return;
710 #if CXX_STD_THREAD
711 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
712 #endif
714 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
715 gdb_assert (gdata->refc >= 1);
717 gdata->refc -= 1;
718 if (gdata->refc > 0)
720 bfd_cache_debug_printf ("Decrease reference count on bfd %s (%s)",
721 host_address_to_string (abfd),
722 bfd_get_filename (abfd));
723 return;
726 bfd_cache_debug_printf ("Delete final reference count on bfd %s (%s)",
727 host_address_to_string (abfd),
728 bfd_get_filename (abfd));
730 archive_bfd = gdata->archive_bfd;
731 search.filename = bfd_get_filename (abfd);
733 if (gdb_bfd_cache && search.filename)
735 hashval_t hash = htab_hash_string (search.filename);
736 void **slot;
738 search.mtime = gdata->mtime;
739 search.size = gdata->size;
740 search.inode = gdata->inode;
741 search.device_id = gdata->device_id;
742 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash,
743 NO_INSERT);
745 if (slot && *slot)
746 htab_clear_slot (gdb_bfd_cache, slot);
749 delete gdata;
750 bfd_set_usrdata (abfd, NULL); /* Paranoia. */
752 htab_remove_elt (all_bfds, abfd);
754 gdb_bfd_close_or_warn (abfd);
756 gdb_bfd_unref (archive_bfd);
759 /* A helper function that returns the section data descriptor
760 associated with SECTION. If no such descriptor exists, a new one
761 is allocated and cleared. */
763 static struct gdb_bfd_section_data *
764 get_section_descriptor (asection *section)
766 struct gdb_bfd_section_data *result;
768 result = (struct gdb_bfd_section_data *) bfd_section_userdata (section);
770 if (result == NULL)
772 result = ((struct gdb_bfd_section_data *)
773 bfd_zalloc (section->owner, sizeof (*result)));
774 bfd_set_section_userdata (section, result);
777 return result;
780 /* See gdb_bfd.h. */
782 const gdb_byte *
783 gdb_bfd_map_section (asection *sectp, bfd_size_type *size)
785 bfd *abfd;
786 struct gdb_bfd_section_data *descriptor;
787 bfd_byte *data;
789 gdb_assert ((sectp->flags & SEC_RELOC) == 0);
790 gdb_assert (size != NULL);
792 abfd = sectp->owner;
794 #if CXX_STD_THREAD
795 gdb_bfd_data *gdata = (gdb_bfd_data *) bfd_usrdata (abfd);
796 std::lock_guard<std::mutex> guard (gdata->per_bfd_mutex);
797 #endif
799 descriptor = get_section_descriptor (sectp);
801 /* If the data was already read for this BFD, just reuse it. */
802 if (descriptor->data != NULL)
803 goto done;
805 #ifdef HAVE_MMAP
806 if (!bfd_is_section_compressed (abfd, sectp))
808 /* The page size, used when mmapping. */
809 static int pagesize;
811 if (pagesize == 0)
812 pagesize = getpagesize ();
814 /* Only try to mmap sections which are large enough: we don't want
815 to waste space due to fragmentation. */
817 if (bfd_section_size (sectp) > 4 * pagesize)
819 descriptor->size = bfd_section_size (sectp);
820 descriptor->data = bfd_mmap (abfd, 0, descriptor->size, PROT_READ,
821 MAP_PRIVATE, sectp->filepos,
822 &descriptor->map_addr,
823 &descriptor->map_len);
825 if ((caddr_t)descriptor->data != MAP_FAILED)
827 #if HAVE_POSIX_MADVISE
828 posix_madvise (descriptor->map_addr, descriptor->map_len,
829 POSIX_MADV_WILLNEED);
830 #endif
831 goto done;
834 /* On failure, clear out the section data and try again. */
835 memset (descriptor, 0, sizeof (*descriptor));
838 #endif /* HAVE_MMAP */
840 /* Handle compressed sections, or ordinary uncompressed sections in
841 the no-mmap case. */
843 descriptor->size = bfd_section_size (sectp);
844 descriptor->data = NULL;
846 data = NULL;
847 if (!bfd_get_full_section_contents (abfd, sectp, &data))
849 warning (_("Can't read data for section '%s' in file '%s'"),
850 bfd_section_name (sectp),
851 bfd_get_filename (abfd));
852 /* Set size to 0 to prevent further attempts to read the invalid
853 section. */
854 *size = 0;
855 return NULL;
857 descriptor->data = data;
859 done:
860 gdb_assert (descriptor->data != NULL);
861 *size = descriptor->size;
862 return (const gdb_byte *) descriptor->data;
865 /* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
866 return 1. Otherwise print a warning and return 0. ABFD seek position is
867 not preserved. */
869 static int
870 get_file_crc (bfd *abfd, unsigned long *file_crc_return)
872 uint32_t file_crc = 0;
874 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
876 warning (_("Problem reading \"%s\" for CRC: %s"),
877 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
878 return 0;
881 for (;;)
883 gdb_byte buffer[8 * 1024];
884 bfd_size_type count;
886 count = bfd_read (buffer, sizeof (buffer), abfd);
887 if (count == (bfd_size_type) -1)
889 warning (_("Problem reading \"%s\" for CRC: %s"),
890 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
891 return 0;
893 if (count == 0)
894 break;
895 file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
898 *file_crc_return = file_crc;
899 return 1;
902 /* See gdb_bfd.h. */
905 gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
907 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
909 if (!gdata->crc_computed)
910 gdata->crc_computed = get_file_crc (abfd, &gdata->crc);
912 if (gdata->crc_computed)
913 *crc_out = gdata->crc;
914 return gdata->crc_computed;
919 /* See gdb_bfd.h. */
921 gdb_bfd_ref_ptr
922 gdb_bfd_fopen (const char *filename, const char *target, const char *mode,
923 int fd)
925 bfd *result = bfd_fopen (filename, target, mode, fd);
927 if (result != nullptr)
928 bfd_set_cacheable (result, 1);
930 return gdb_bfd_ref_ptr::new_reference (result);
933 /* See gdb_bfd.h. */
935 gdb_bfd_ref_ptr
936 gdb_bfd_openr (const char *filename, const char *target)
938 bfd *result = bfd_openr (filename, target);
940 return gdb_bfd_ref_ptr::new_reference (result);
943 /* See gdb_bfd.h. */
945 gdb_bfd_ref_ptr
946 gdb_bfd_openw (const char *filename, const char *target)
948 bfd *result = bfd_openw (filename, target);
950 return gdb_bfd_ref_ptr::new_reference (result);
953 /* See gdb_bfd.h. */
955 gdb_bfd_ref_ptr
956 gdb_bfd_openr_iovec (const char *filename, const char *target,
957 gdb_iovec_opener_ftype open_fn)
959 auto do_open = [] (bfd *nbfd, void *closure) -> void *
961 auto real_opener = static_cast<gdb_iovec_opener_ftype *> (closure);
962 /* Prevent exceptions from escaping to C code and triggering an abort. */
963 auto res = catch_exceptions<gdb_bfd_iovec_base *, nullptr> ([&]
965 return (*real_opener) (nbfd);
967 if (res == nullptr)
969 errno = EIO;
970 bfd_set_error (bfd_error_system_call);
972 return res;
975 auto read_trampoline = [] (bfd *nbfd, void *stream, void *buf,
976 file_ptr nbytes, file_ptr offset) -> file_ptr
978 gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
979 /* Prevent exceptions from escaping to C code and triggering an abort. */
980 auto res = catch_exceptions<long int, -1> ([&]
982 return obj->read (nbfd, buf, nbytes, offset);
984 if (res == -1)
986 errno = EIO;
987 bfd_set_error (bfd_error_system_call);
989 return res;
992 auto stat_trampoline = [] (struct bfd *abfd, void *stream,
993 struct stat *sb) -> int
995 gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
996 /* Prevent exceptions from escaping to C code and triggering an abort. */
997 auto res = catch_exceptions<int, -1> ([&]
999 return obj->stat (abfd, sb);
1001 if (res == -1)
1003 errno = EIO;
1004 bfd_set_error (bfd_error_system_call);
1006 return res;
1009 auto close_trampoline = [] (struct bfd *nbfd, void *stream) -> int
1011 gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
1012 delete obj;
1013 /* Success. */
1014 return 0;
1017 bfd *result = bfd_openr_iovec (filename, target,
1018 do_open, &open_fn,
1019 read_trampoline, close_trampoline,
1020 stat_trampoline);
1022 return gdb_bfd_ref_ptr::new_reference (result);
1025 /* See gdb_bfd.h. */
1027 void
1028 gdb_bfd_mark_parent (bfd *child, bfd *parent)
1030 struct gdb_bfd_data *gdata;
1032 gdb_bfd_ref (child);
1033 /* No need to stash the filename here, because we also keep a
1034 reference on the parent archive. */
1036 gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
1037 if (gdata->archive_bfd == NULL)
1039 gdata->archive_bfd = parent;
1040 gdb_bfd_ref (parent);
1042 else
1043 gdb_assert (gdata->archive_bfd == parent);
1046 /* See gdb_bfd.h. */
1048 gdb_bfd_ref_ptr
1049 gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
1051 bfd *result = bfd_openr_next_archived_file (archive, previous);
1053 if (result)
1054 gdb_bfd_mark_parent (result, archive);
1056 return gdb_bfd_ref_ptr (result);
1059 /* See gdb_bfd.h. */
1061 void
1062 gdb_bfd_record_inclusion (bfd *includer, bfd *includee)
1064 struct gdb_bfd_data *gdata;
1066 gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
1067 gdata->included_bfds.push_back (gdb_bfd_ref_ptr::new_reference (includee));
1072 static_assert (ARRAY_SIZE (_bfd_std_section) == 4);
1074 /* See gdb_bfd.h. */
1077 gdb_bfd_section_index (bfd *abfd, asection *section)
1079 if (section == NULL)
1080 return -1;
1081 else if (section == bfd_com_section_ptr)
1082 return bfd_count_sections (abfd);
1083 else if (section == bfd_und_section_ptr)
1084 return bfd_count_sections (abfd) + 1;
1085 else if (section == bfd_abs_section_ptr)
1086 return bfd_count_sections (abfd) + 2;
1087 else if (section == bfd_ind_section_ptr)
1088 return bfd_count_sections (abfd) + 3;
1089 return section->index;
1092 /* See gdb_bfd.h. */
1095 gdb_bfd_count_sections (bfd *abfd)
1097 return bfd_count_sections (abfd) + 4;
1100 /* See gdb_bfd.h. */
1103 gdb_bfd_requires_relocations (bfd *abfd)
1105 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1107 if (gdata->relocation_computed == 0)
1109 asection *sect;
1111 for (sect = abfd->sections; sect != NULL; sect = sect->next)
1112 if ((sect->flags & SEC_RELOC) != 0)
1114 gdata->needs_relocations = 1;
1115 break;
1118 gdata->relocation_computed = 1;
1121 return gdata->needs_relocations;
1124 /* See gdb_bfd.h. */
1126 bool
1127 gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
1128 gdb::byte_vector *contents)
1130 #if CXX_STD_THREAD
1131 gdb_bfd_data *gdata = (gdb_bfd_data *) bfd_usrdata (abfd);
1132 std::lock_guard<std::mutex> guard (gdata->per_bfd_mutex);
1133 #endif
1135 bfd_size_type section_size = bfd_section_size (section);
1137 contents->resize (section_size);
1139 return bfd_get_section_contents (abfd, section, contents->data (), 0,
1140 section_size);
1143 #define AMBIGUOUS_MESS1 ".\nMatching formats:"
1144 #define AMBIGUOUS_MESS2 \
1145 ".\nUse \"set gnutarget format-name\" to specify the format."
1147 /* See gdb_bfd.h. */
1149 std::string
1150 gdb_bfd_errmsg (bfd_error_type error_tag, char **matching)
1152 char **p;
1154 /* Check if errmsg just need simple return. */
1155 if (error_tag != bfd_error_file_ambiguously_recognized || matching == NULL)
1156 return bfd_errmsg (error_tag);
1158 std::string ret (bfd_errmsg (error_tag));
1159 ret += AMBIGUOUS_MESS1;
1161 for (p = matching; *p; p++)
1163 ret += " ";
1164 ret += *p;
1166 ret += AMBIGUOUS_MESS2;
1168 xfree (matching);
1170 return ret;
1173 /* A callback for htab_traverse that prints a single BFD. */
1175 static int
1176 print_one_bfd (void **slot, void *data)
1178 bfd *abfd = (struct bfd *) *slot;
1179 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1180 struct ui_out *uiout = (struct ui_out *) data;
1182 ui_out_emit_tuple tuple_emitter (uiout, NULL);
1183 uiout->field_signed ("refcount", gdata->refc);
1184 uiout->field_string ("addr", host_address_to_string (abfd));
1185 uiout->field_string ("filename", bfd_get_filename (abfd),
1186 file_name_style.style ());
1187 uiout->text ("\n");
1189 return 1;
1192 /* Implement the 'maint info bfd' command. */
1194 static void
1195 maintenance_info_bfds (const char *arg, int from_tty)
1197 struct ui_out *uiout = current_uiout;
1199 ui_out_emit_table table_emitter (uiout, 3, -1, "bfds");
1200 uiout->table_header (10, ui_left, "refcount", "Refcount");
1201 uiout->table_header (18, ui_left, "addr", "Address");
1202 uiout->table_header (40, ui_left, "filename", "Filename");
1204 uiout->table_body ();
1205 htab_traverse_noresize (all_bfds, print_one_bfd, uiout);
1208 /* BFD related per-inferior data. */
1210 struct bfd_inferior_data
1212 std::unordered_map<std::string, unsigned long> bfd_error_string_counts;
1215 /* Per-inferior data key. */
1217 static const registry<inferior>::key<bfd_inferior_data> bfd_inferior_data_key;
1219 /* Fetch per-inferior BFD data. It always returns a valid pointer to
1220 a bfd_inferior_data struct. */
1222 static struct bfd_inferior_data *
1223 get_bfd_inferior_data (struct inferior *inf)
1225 struct bfd_inferior_data *data;
1227 data = bfd_inferior_data_key.get (inf);
1228 if (data == nullptr)
1229 data = bfd_inferior_data_key.emplace (inf);
1231 return data;
1234 /* Increment the BFD error count for STR and return the updated
1235 count. */
1237 static unsigned long
1238 increment_bfd_error_count (const std::string &str)
1240 #if CXX_STD_THREAD
1241 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
1242 #endif
1243 struct bfd_inferior_data *bid = get_bfd_inferior_data (current_inferior ());
1245 auto &map = bid->bfd_error_string_counts;
1246 return ++map[str];
1249 /* A print callback for bfd_print_error. */
1251 static int ATTRIBUTE_PRINTF (2, 0)
1252 print_error_callback (void *stream, const char *fmt, ...)
1254 string_file *file = (string_file *) stream;
1255 size_t in_size = file->size ();
1256 va_list ap;
1257 va_start (ap, fmt);
1258 file->vprintf (fmt, ap);
1259 va_end (ap);
1260 return file->size () - in_size;
1263 /* Define a BFD error handler which will suppress the printing of
1264 messages which have been printed once already. This is done on a
1265 per-inferior basis. */
1267 static void
1268 gdb_bfd_error_handler (const char *fmt, va_list ap)
1270 string_file output;
1271 bfd_print_error (print_error_callback, &output, fmt, ap);
1272 std::string str = output.release ();
1274 if (increment_bfd_error_count (str) > 1)
1275 return;
1277 warning ("%s", str.c_str ());
1280 /* See gdb_bfd.h. */
1282 void
1283 gdb_bfd_init ()
1285 if (bfd_init () == BFD_INIT_MAGIC)
1287 #if CXX_STD_THREAD
1288 if (bfd_thread_init (gdb_bfd_lock, gdb_bfd_unlock, nullptr))
1289 #endif
1290 return;
1293 error (_("fatal error: libbfd ABI mismatch"));
1296 void _initialize_gdb_bfd ();
1297 void
1298 _initialize_gdb_bfd ()
1300 all_bfds = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
1301 NULL, xcalloc, xfree);
1303 add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
1304 List the BFDs that are currently open."),
1305 &maintenanceinfolist);
1307 add_setshow_boolean_cmd ("bfd-sharing", no_class,
1308 &bfd_sharing, _("\
1309 Set whether gdb will share bfds that appear to be the same file."), _("\
1310 Show whether gdb will share bfds that appear to be the same file."), _("\
1311 When enabled gdb will reuse existing bfds rather than reopening the\n\
1312 same file. To decide if two files are the same then gdb compares the\n\
1313 filename, file size, file modification time, and file inode."),
1314 NULL,
1315 &show_bfd_sharing,
1316 &maintenance_set_cmdlist,
1317 &maintenance_show_cmdlist);
1319 add_setshow_boolean_cmd ("bfd-cache", class_maintenance,
1320 &debug_bfd_cache,
1321 _("Set bfd cache debugging."),
1322 _("Show bfd cache debugging."),
1323 _("\
1324 When non-zero, bfd cache specific debugging is enabled."),
1325 NULL,
1326 &show_bfd_cache_debug,
1327 &setdebuglist, &showdebuglist);
1329 /* Hook the BFD error/warning handler to limit amount of output. */
1330 bfd_set_error_handler (gdb_bfd_error_handler);