]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdb_bfd.c
gdb: move a bunch of quit-related things to event-top.{c,h}
[thirdparty/binutils-gdb.git] / gdb / gdb_bfd.c
CommitLineData
cbb099e8
TT
1/* Definitions for BFD wrappers used by GDB.
2
1d506c26 3 Copyright (C) 2011-2024 Free Software Foundation, Inc.
cbb099e8
TT
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
cbb099e8 20#include "gdb_bfd.h"
e5dc0d5d 21#include "event-top.h"
d6b28940
TT
22#include "ui-out.h"
23#include "gdbcmd.h"
6ec53d05 24#include "hashtab.h"
268a13a5 25#include "gdbsupport/filestuff.h"
4bf44c1c
TT
26#ifdef HAVE_MMAP
27#include <sys/mman.h>
28#ifndef MAP_FAILED
29#define MAP_FAILED ((void *) -1)
30#endif
31#endif
f08e97fe 32#include "target.h"
198f946f 33#include "gdbsupport/fileio.h"
07c138c8 34#include "inferior.h"
972f7a4b 35#include "cli/cli-style.h"
84e60555 36#include <unordered_map>
4bf44c1c 37
da0e2ac4
TT
38#if CXX_STD_THREAD
39
40#include <mutex>
41
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. */
46static std::recursive_mutex gdb_bfd_mutex;
47
48/* BFD locking function. */
49
50static bool
51gdb_bfd_lock (void *ignore)
52{
53 gdb_bfd_mutex.lock ();
54 return true;
55}
56
57/* BFD unlocking function. */
58
59static bool
60gdb_bfd_unlock (void *ignore)
61{
62 gdb_bfd_mutex.unlock ();
63 return true;
64}
65
66#endif /* CXX_STD_THREAD */
67
4bf44c1c
TT
68/* An object of this type is stored in the section's user data when
69 mapping a section. */
70
71struct gdb_bfd_section_data
72{
73 /* Size of the data. */
033679b1 74 size_t size;
4bf44c1c 75 /* If the data was mmapped, this is the length of the map. */
033679b1 76 size_t map_len;
4bf44c1c
TT
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;
81};
a4453b7e 82
d6b28940
TT
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". */
87
88static htab_t all_bfds;
89
6ec53d05
TT
90/* An object of this type is stored in each BFD's user data. */
91
92struct gdb_bfd_data
93{
3cae4447
TT
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),
06d5bbc8
TT
100 relocation_computed (0),
101 needs_relocations (0),
102 crc_computed (0)
103 {
06d5bbc8
TT
104 }
105
106 ~gdb_bfd_data ()
107 {
06d5bbc8
TT
108 }
109
6ec53d05 110 /* The reference count. */
06d5bbc8 111 int refc = 1;
6ec53d05
TT
112
113 /* The mtime of the BFD at the point the cache entry was made. */
114 time_t mtime;
b82d08cd 115
c04fe68f
AB
116 /* The file size (in bytes) at the point the cache entry was made. */
117 off_t size;
118
119 /* The inode of the file at the point the cache entry was made. */
120 ino_t inode;
121
122 /* The device id of the file at the point the cache entry was made. */
123 dev_t device_id;
124
1da77581
TT
125 /* This is true if we have determined whether this BFD has any
126 sections requiring relocation. */
127 unsigned int relocation_computed : 1;
128
129 /* This is true if any section needs relocation. */
130 unsigned int needs_relocations : 1;
131
dccee2de
TT
132 /* This is true if we have successfully computed the file's CRC. */
133 unsigned int crc_computed : 1;
134
135 /* The file's CRC. */
06d5bbc8 136 unsigned long crc = 0;
dccee2de 137
b82d08cd
TT
138 /* If the BFD comes from an archive, this points to the archive's
139 BFD. Otherwise, this is NULL. */
06d5bbc8 140 bfd *archive_bfd = nullptr;
e992eda4 141
13aaf454 142 /* Table of all the bfds this bfd has included. */
d5833c62 143 std::vector<gdb_bfd_ref_ptr> included_bfds;
13aaf454 144
e992eda4 145 /* The registry. */
08b8a139 146 registry<bfd> registry_fields;
6ec53d05
TT
147};
148
08b8a139
TT
149registry<bfd> *
150registry_accessor<bfd>::get (bfd *abfd)
151{
152 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
153 return &gdata->registry_fields;
154}
e992eda4 155
6ec53d05
TT
156/* A hash table storing all the BFDs maintained in the cache. */
157
158static htab_t gdb_bfd_cache;
159
18989b3c
AB
160/* When true gdb will reuse an existing bfd object if the filename,
161 modification time, and file size all match. */
162
491144b5 163static bool bfd_sharing = true;
18989b3c
AB
164static void
165show_bfd_sharing (struct ui_file *file, int from_tty,
166 struct cmd_list_element *c, const char *value)
167{
6cb06a8c 168 gdb_printf (file, _("BFD sharing is %s.\n"), value);
18989b3c
AB
169}
170
d4dd4fca
SM
171/* When true debugging of the bfd caches is enabled. */
172
173static bool debug_bfd_cache;
566f5e3b 174
1e15fcac
SM
175/* Print an "bfd-cache" debug statement. */
176
177#define bfd_cache_debug_printf(fmt, ...) \
178 debug_prefixed_printf_cond (debug_bfd_cache, "bfd-cache", fmt, ##__VA_ARGS__)
179
566f5e3b
AB
180static void
181show_bfd_cache_debug (struct ui_file *file, int from_tty,
182 struct cmd_list_element *c, const char *value)
183{
6cb06a8c 184 gdb_printf (file, _("BFD cache debugging is %s.\n"), value);
566f5e3b
AB
185}
186
6ec53d05
TT
187/* The type of an object being looked up in gdb_bfd_cache. We use
188 htab's capability of storing one kind of object (BFD in this case)
189 and using a different sort of object for searching. */
190
191struct gdb_bfd_cache_search
192{
193 /* The filename. */
194 const char *filename;
195 /* The mtime. */
196 time_t mtime;
c04fe68f
AB
197 /* The file size (in bytes). */
198 off_t size;
199 /* The inode of the file. */
200 ino_t inode;
201 /* The device id of the file. */
202 dev_t device_id;
6ec53d05
TT
203};
204
205/* A hash function for BFDs. */
206
207static hashval_t
208hash_bfd (const void *b)
209{
9a3c8263 210 const bfd *abfd = (const struct bfd *) b;
6ec53d05
TT
211
212 /* It is simplest to just hash the filename. */
213 return htab_hash_string (bfd_get_filename (abfd));
214}
215
216/* An equality function for BFDs. Note that this expects the caller
217 to search using struct gdb_bfd_cache_search only, not BFDs. */
218
219static int
220eq_bfd (const void *a, const void *b)
221{
9a3c8263
SM
222 const bfd *abfd = (const struct bfd *) a;
223 const struct gdb_bfd_cache_search *s
224 = (const struct gdb_bfd_cache_search *) b;
225 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
6ec53d05
TT
226
227 return (gdata->mtime == s->mtime
c04fe68f
AB
228 && gdata->size == s->size
229 && gdata->inode == s->inode
230 && gdata->device_id == s->device_id
6ec53d05
TT
231 && strcmp (bfd_get_filename (abfd), s->filename) == 0);
232}
233
234/* See gdb_bfd.h. */
235
f08e97fe
GB
236int
237is_target_filename (const char *name)
238{
239 return startswith (name, TARGET_SYSROOT_PREFIX);
240}
241
242/* See gdb_bfd.h. */
243
244int
245gdb_bfd_has_target_filename (struct bfd *abfd)
246{
247 return is_target_filename (bfd_get_filename (abfd));
248}
249
66984afd
AB
250/* For `gdb_bfd_open_from_target_memory`. An object that manages the
251 details of a BFD in target memory. */
15cc148f 252
4d2edefa 253struct target_buffer : public gdb_bfd_iovec_base
15cc148f 254{
66984afd
AB
255 /* Constructor. BASE and SIZE define where the BFD can be found in
256 target memory. */
257 target_buffer (CORE_ADDR base, ULONGEST size)
258 : m_base (base),
5153027c 259 m_size (size),
c96ceed9
MM
260 m_filename (xstrprintf ("<in-memory@%s-%s>",
261 core_addr_to_string_nz (m_base),
262 core_addr_to_string_nz (m_base + m_size)))
66984afd 263 {
66984afd
AB
264 }
265
266 /* Return the size of the in-memory BFD file. */
267 ULONGEST size () const
268 { return m_size; }
269
270 /* Return the base address of the in-memory BFD file. */
271 CORE_ADDR base () const
272 { return m_base; }
273
274 /* Return a generated filename for the in-memory BFD file. The generated
c96ceed9 275 name will include the begin and end address of the in-memory file. */
66984afd
AB
276 const char *filename () const
277 { return m_filename.get (); }
278
4d2edefa
TT
279 file_ptr read (bfd *abfd, void *buffer, file_ptr nbytes,
280 file_ptr offset) override;
281
282 int stat (struct bfd *abfd, struct stat *sb) override;
283
66984afd
AB
284private:
285 /* The base address of the in-memory BFD file. */
286 CORE_ADDR m_base;
287
288 /* The size (in-bytes) of the in-memory BFD file. */
289 ULONGEST m_size;
290
291 /* Holds the generated name of the in-memory BFD file. */
292 gdb::unique_xmalloc_ptr<char> m_filename;
15cc148f
MS
293};
294
15cc148f
MS
295/* For `gdb_bfd_open_from_target_memory`. For reading the file, we just need to
296 pass through to target_read_memory and fix up the arguments and return
297 values. */
298
4d2edefa
TT
299file_ptr
300target_buffer::read (struct bfd *abfd, void *buf,
15cc148f
MS
301 file_ptr nbytes, file_ptr offset)
302{
15cc148f 303 /* If this read will read all of the file, limit it to just the rest. */
4d2edefa
TT
304 if (offset + nbytes > size ())
305 nbytes = size () - offset;
15cc148f
MS
306
307 /* If there are no more bytes left, we've reached EOF. */
308 if (nbytes == 0)
309 return 0;
310
4d2edefa 311 int err = target_read_memory (base () + offset, (gdb_byte *) buf, nbytes);
15cc148f
MS
312 if (err)
313 return -1;
314
315 return nbytes;
316}
317
318/* For `gdb_bfd_open_from_target_memory`. For statting the file, we only
319 support the st_size attribute. */
320
4d2edefa
TT
321int
322target_buffer::stat (struct bfd *abfd, struct stat *sb)
15cc148f 323{
15cc148f 324 memset (sb, 0, sizeof (struct stat));
4d2edefa 325 sb->st_size = size ();
15cc148f
MS
326 return 0;
327}
328
329/* See gdb_bfd.h. */
330
331gdb_bfd_ref_ptr
332gdb_bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
322dd71c 333 const char *target)
15cc148f 334{
4d2edefa 335 std::unique_ptr<target_buffer> buffer
6b62451a 336 = std::make_unique<target_buffer> (addr, size);
15cc148f 337
66984afd 338 return gdb_bfd_openr_iovec (buffer->filename (), target,
4d2edefa
TT
339 [&] (bfd *nbfd)
340 {
341 return buffer.release ();
342 });
15cc148f 343}
f08e97fe 344
dcc04527
TT
345/* An object that manages the underlying stream for a BFD, using
346 target file I/O. */
347
348struct target_fileio_stream : public gdb_bfd_iovec_base
98c59b52 349{
dcc04527
TT
350 target_fileio_stream (bfd *nbfd, int fd)
351 : m_bfd (nbfd),
352 m_fd (fd)
353 {
354 }
355
356 ~target_fileio_stream ();
357
358 file_ptr read (bfd *abfd, void *buffer, file_ptr nbytes,
359 file_ptr offset) override;
360
361 int stat (struct bfd *abfd, struct stat *sb) override;
362
363private:
364
365 /* The BFD. Saved for the destructor. */
366 bfd *m_bfd;
367
368 /* The file descriptor. */
369 int m_fd;
98c59b52
PA
370};
371
dcc04527
TT
372/* Wrapper for target_fileio_open suitable for use as a helper
373 function for gdb_bfd_openr_iovec. */
f08e97fe 374
dcc04527
TT
375static target_fileio_stream *
376gdb_bfd_iovec_fileio_open (struct bfd *abfd, inferior *inf, bool warn_if_slow)
f08e97fe
GB
377{
378 const char *filename = bfd_get_filename (abfd);
b872057a
SM
379 int fd;
380 fileio_error target_errno;
f08e97fe
GB
381
382 gdb_assert (is_target_filename (filename));
383
dcc04527 384 fd = target_fileio_open (inf,
4111f652 385 filename + strlen (TARGET_SYSROOT_PREFIX),
dcc04527 386 FILEIO_O_RDONLY, 0, warn_if_slow,
4111f652 387 &target_errno);
f08e97fe
GB
388 if (fd == -1)
389 {
517a63c2 390 errno = fileio_error_to_host (target_errno);
f08e97fe
GB
391 bfd_set_error (bfd_error_system_call);
392 return NULL;
393 }
394
dcc04527 395 return new target_fileio_stream (abfd, fd);
f08e97fe
GB
396}
397
dcc04527 398/* Wrapper for target_fileio_pread. */
f08e97fe 399
dcc04527
TT
400file_ptr
401target_fileio_stream::read (struct bfd *abfd, void *buf,
f08e97fe
GB
402 file_ptr nbytes, file_ptr offset)
403{
b872057a 404 fileio_error target_errno;
f08e97fe
GB
405 file_ptr pos, bytes;
406
407 pos = 0;
408 while (nbytes > pos)
409 {
2d7711a3
GB
410 QUIT;
411
dcc04527 412 bytes = target_fileio_pread (m_fd, (gdb_byte *) buf + pos,
f08e97fe
GB
413 nbytes - pos, offset + pos,
414 &target_errno);
415 if (bytes == 0)
dda83cd7
SM
416 /* Success, but no bytes, means end-of-file. */
417 break;
f08e97fe
GB
418 if (bytes == -1)
419 {
517a63c2 420 errno = fileio_error_to_host (target_errno);
f08e97fe
GB
421 bfd_set_error (bfd_error_system_call);
422 return -1;
423 }
424
425 pos += bytes;
426 }
427
428 return pos;
429}
430
3a76f8f4
PA
431/* Warn that it wasn't possible to close a bfd for file NAME, because
432 of REASON. */
433
434static void
435gdb_bfd_close_warning (const char *name, const char *reason)
436{
437 warning (_("cannot close \"%s\": %s"), name, reason);
438}
439
dcc04527 440/* Wrapper for target_fileio_close. */
f08e97fe 441
dcc04527 442target_fileio_stream::~target_fileio_stream ()
f08e97fe 443{
b872057a 444 fileio_error target_errno;
f08e97fe 445
f08e97fe
GB
446 /* Ignore errors on close. These may happen with remote
447 targets if the connection has already been torn down. */
3a76f8f4
PA
448 try
449 {
dcc04527 450 target_fileio_close (m_fd, &target_errno);
3a76f8f4
PA
451 }
452 catch (const gdb_exception &ex)
453 {
454 /* Also avoid crossing exceptions over bfd. */
dcc04527 455 gdb_bfd_close_warning (bfd_get_filename (m_bfd),
3a76f8f4
PA
456 ex.message->c_str ());
457 }
f08e97fe
GB
458}
459
dcc04527 460/* Wrapper for target_fileio_fstat. */
f08e97fe 461
dcc04527
TT
462int
463target_fileio_stream::stat (struct bfd *abfd, struct stat *sb)
f08e97fe 464{
b872057a 465 fileio_error target_errno;
f08e97fe
GB
466 int result;
467
dcc04527 468 result = target_fileio_fstat (m_fd, sb, &target_errno);
f08e97fe
GB
469 if (result == -1)
470 {
517a63c2 471 errno = fileio_error_to_host (target_errno);
f08e97fe
GB
472 bfd_set_error (bfd_error_system_call);
473 }
474
475 return result;
476}
477
3cae4447
TT
478/* A helper function to initialize the data that gdb attaches to each
479 BFD. */
480
481static void
482gdb_bfd_init_data (struct bfd *abfd, struct stat *st)
483{
484 struct gdb_bfd_data *gdata;
485 void **slot;
486
487 gdb_assert (bfd_usrdata (abfd) == nullptr);
488
489 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
490 abfd->flags |= BFD_DECOMPRESS;
491
492 gdata = new gdb_bfd_data (abfd, st);
493 bfd_set_usrdata (abfd, gdata);
3cae4447
TT
494
495 /* This is the first we've seen it, so add it to the hash table. */
496 slot = htab_find_slot (all_bfds, abfd, INSERT);
497 gdb_assert (slot && !*slot);
498 *slot = abfd;
499}
500
f08e97fe
GB
501/* See gdb_bfd.h. */
502
192b62ce 503gdb_bfd_ref_ptr
98c59b52
PA
504gdb_bfd_open (const char *name, const char *target, int fd,
505 bool warn_if_slow)
6ec53d05
TT
506{
507 hashval_t hash;
508 void **slot;
509 bfd *abfd;
510 struct gdb_bfd_cache_search search;
511 struct stat st;
512
f08e97fe
GB
513 if (is_target_filename (name))
514 {
515 if (!target_filesystem_is_local ())
516 {
517 gdb_assert (fd == -1);
518
dcc04527
TT
519 auto open = [&] (bfd *nbfd) -> gdb_bfd_iovec_base *
520 {
521 return gdb_bfd_iovec_fileio_open (nbfd, current_inferior (),
522 warn_if_slow);
523 };
524
525 return gdb_bfd_openr_iovec (name, target, open);
f08e97fe
GB
526 }
527
528 name += strlen (TARGET_SYSROOT_PREFIX);
529 }
530
da0e2ac4
TT
531#if CXX_STD_THREAD
532 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
533#endif
534
6ec53d05
TT
535 if (gdb_bfd_cache == NULL)
536 gdb_bfd_cache = htab_create_alloc (1, hash_bfd, eq_bfd, NULL,
537 xcalloc, xfree);
538
539 if (fd == -1)
540 {
13084383 541 fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0).release ();
6ec53d05
TT
542 if (fd == -1)
543 {
544 bfd_set_error (bfd_error_system_call);
545 return NULL;
546 }
547 }
548
6ec53d05
TT
549 if (fstat (fd, &st) < 0)
550 {
3cae4447 551 /* Weird situation here -- don't cache if we can't stat. */
1e15fcac 552 bfd_cache_debug_printf ("Could not stat %s - not caching", name);
03b0a45f
TT
553 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
554 if (abfd == nullptr)
555 return nullptr;
3cae4447 556 return gdb_bfd_ref_ptr::new_reference (abfd);
c04fe68f 557 }
6ec53d05 558
3cae4447
TT
559 search.filename = name;
560 search.mtime = st.st_mtime;
561 search.size = st.st_size;
562 search.inode = st.st_ino;
563 search.device_id = st.st_dev;
564
6ec53d05
TT
565 /* Note that this must compute the same result as hash_bfd. */
566 hash = htab_hash_string (name);
567 /* Note that we cannot use htab_find_slot_with_hash here, because
568 opening the BFD may fail; and this would violate hashtab
569 invariants. */
9a3c8263 570 abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
18989b3c 571 if (bfd_sharing && abfd != NULL)
6ec53d05 572 {
1e15fcac
SM
573 bfd_cache_debug_printf ("Reusing cached bfd %s for %s",
574 host_address_to_string (abfd),
575 bfd_get_filename (abfd));
6ec53d05 576 close (fd);
1831a9f9 577 return gdb_bfd_ref_ptr::new_reference (abfd);
6ec53d05
TT
578 }
579
580 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
581 if (abfd == NULL)
582 return NULL;
583
0ecf4403
TT
584 bfd_set_cacheable (abfd, 1);
585
1e15fcac
SM
586 bfd_cache_debug_printf ("Creating new bfd %s for %s",
587 host_address_to_string (abfd),
588 bfd_get_filename (abfd));
566f5e3b 589
18989b3c
AB
590 if (bfd_sharing)
591 {
592 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
593 gdb_assert (!*slot);
594 *slot = abfd;
595 }
6ec53d05 596
3cae4447
TT
597 /* It's important to pass the already-computed stat info here,
598 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
599 default will "stat" the file each time bfd_get_mtime is called --
600 and since we already entered it into the hash table using this
601 mtime, if the file changed at the wrong moment, the race would
602 lead to a hash table corruption. */
603 gdb_bfd_init_data (abfd, &st);
604 return gdb_bfd_ref_ptr (abfd);
6ec53d05
TT
605}
606
4bf44c1c
TT
607/* A helper function that releases any section data attached to the
608 BFD. */
609
610static void
1ce51eb5 611free_one_bfd_section (asection *sectp)
4bf44c1c 612{
9a3c8263 613 struct gdb_bfd_section_data *sect
fd361982 614 = (struct gdb_bfd_section_data *) bfd_section_userdata (sectp);
4bf44c1c
TT
615
616 if (sect != NULL && sect->data != NULL)
617 {
618#ifdef HAVE_MMAP
619 if (sect->map_addr != NULL)
620 {
621 int res;
622
623 res = munmap (sect->map_addr, sect->map_len);
624 gdb_assert (res == 0);
625 }
626 else
627#endif
628 xfree (sect->data);
629 }
630}
631
cbb099e8
TT
632/* Close ABFD, and warn if that fails. */
633
634static int
635gdb_bfd_close_or_warn (struct bfd *abfd)
636{
637 int ret;
b16c44de 638 const char *name = bfd_get_filename (abfd);
cbb099e8 639
1ce51eb5
TT
640 for (asection *sect : gdb_bfd_sections (abfd))
641 free_one_bfd_section (sect);
4bf44c1c 642
cbb099e8
TT
643 ret = bfd_close (abfd);
644
645 if (!ret)
3a76f8f4
PA
646 gdb_bfd_close_warning (name,
647 bfd_errmsg (bfd_get_error ()));
cbb099e8
TT
648
649 return ret;
650}
651
596f7d67 652/* See gdb_bfd.h. */
cbb099e8 653
520b0001 654void
cbb099e8
TT
655gdb_bfd_ref (struct bfd *abfd)
656{
6ec53d05 657 struct gdb_bfd_data *gdata;
cbb099e8
TT
658
659 if (abfd == NULL)
520b0001 660 return;
cbb099e8 661
da0e2ac4
TT
662#if CXX_STD_THREAD
663 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
664#endif
665
9a3c8263 666 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
cbb099e8 667
1e15fcac
SM
668 bfd_cache_debug_printf ("Increase reference count on bfd %s (%s)",
669 host_address_to_string (abfd),
670 bfd_get_filename (abfd));
566f5e3b 671
6ec53d05 672 if (gdata != NULL)
cbb099e8 673 {
6ec53d05 674 gdata->refc += 1;
520b0001 675 return;
cbb099e8
TT
676 }
677
3cae4447
TT
678 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
679 fine. */
680 gdb_bfd_init_data (abfd, nullptr);
cbb099e8
TT
681}
682
596f7d67 683/* See gdb_bfd.h. */
cbb099e8
TT
684
685void
686gdb_bfd_unref (struct bfd *abfd)
687{
6ec53d05
TT
688 struct gdb_bfd_data *gdata;
689 struct gdb_bfd_cache_search search;
06d5bbc8 690 bfd *archive_bfd;
cbb099e8
TT
691
692 if (abfd == NULL)
693 return;
694
da0e2ac4
TT
695#if CXX_STD_THREAD
696 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
697#endif
698
9a3c8263 699 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
6ec53d05 700 gdb_assert (gdata->refc >= 1);
cbb099e8 701
6ec53d05
TT
702 gdata->refc -= 1;
703 if (gdata->refc > 0)
566f5e3b 704 {
1e15fcac
SM
705 bfd_cache_debug_printf ("Decrease reference count on bfd %s (%s)",
706 host_address_to_string (abfd),
707 bfd_get_filename (abfd));
566f5e3b
AB
708 return;
709 }
710
1e15fcac
SM
711 bfd_cache_debug_printf ("Delete final reference count on bfd %s (%s)",
712 host_address_to_string (abfd),
713 bfd_get_filename (abfd));
cbb099e8 714
b82d08cd 715 archive_bfd = gdata->archive_bfd;
6ec53d05
TT
716 search.filename = bfd_get_filename (abfd);
717
718 if (gdb_bfd_cache && search.filename)
719 {
720 hashval_t hash = htab_hash_string (search.filename);
721 void **slot;
722
723 search.mtime = gdata->mtime;
c04fe68f
AB
724 search.size = gdata->size;
725 search.inode = gdata->inode;
726 search.device_id = gdata->device_id;
6ec53d05
TT
727 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash,
728 NO_INSERT);
729
730 if (slot && *slot)
731 htab_clear_slot (gdb_bfd_cache, slot);
732 }
733
06d5bbc8 734 delete gdata;
00f93c44 735 bfd_set_usrdata (abfd, NULL); /* Paranoia. */
cbb099e8 736
d6b28940
TT
737 htab_remove_elt (all_bfds, abfd);
738
cbb099e8 739 gdb_bfd_close_or_warn (abfd);
b82d08cd
TT
740
741 gdb_bfd_unref (archive_bfd);
cbb099e8 742}
4bf44c1c
TT
743
744/* A helper function that returns the section data descriptor
745 associated with SECTION. If no such descriptor exists, a new one
746 is allocated and cleared. */
747
748static struct gdb_bfd_section_data *
749get_section_descriptor (asection *section)
750{
751 struct gdb_bfd_section_data *result;
752
fd361982 753 result = (struct gdb_bfd_section_data *) bfd_section_userdata (section);
4bf44c1c
TT
754
755 if (result == NULL)
756 {
224c3ddb
SM
757 result = ((struct gdb_bfd_section_data *)
758 bfd_zalloc (section->owner, sizeof (*result)));
fd361982 759 bfd_set_section_userdata (section, result);
4bf44c1c
TT
760 }
761
762 return result;
763}
764
4bf44c1c
TT
765/* See gdb_bfd.h. */
766
767const gdb_byte *
768gdb_bfd_map_section (asection *sectp, bfd_size_type *size)
769{
770 bfd *abfd;
4bf44c1c 771 struct gdb_bfd_section_data *descriptor;
ea9f10bb 772 bfd_byte *data;
4bf44c1c
TT
773
774 gdb_assert ((sectp->flags & SEC_RELOC) == 0);
775 gdb_assert (size != NULL);
776
777 abfd = sectp->owner;
778
779 descriptor = get_section_descriptor (sectp);
780
781 /* If the data was already read for this BFD, just reuse it. */
782 if (descriptor->data != NULL)
783 goto done;
784
ea9f10bb
TT
785#ifdef HAVE_MMAP
786 if (!bfd_is_section_compressed (abfd, sectp))
4bf44c1c 787 {
ea9f10bb
TT
788 /* The page size, used when mmapping. */
789 static int pagesize;
4bf44c1c 790
ea9f10bb
TT
791 if (pagesize == 0)
792 pagesize = getpagesize ();
793
794 /* Only try to mmap sections which are large enough: we don't want
795 to waste space due to fragmentation. */
796
fd361982 797 if (bfd_section_size (sectp) > 4 * pagesize)
ea9f10bb 798 {
fd361982 799 descriptor->size = bfd_section_size (sectp);
ea9f10bb
TT
800 descriptor->data = bfd_mmap (abfd, 0, descriptor->size, PROT_READ,
801 MAP_PRIVATE, sectp->filepos,
802 &descriptor->map_addr,
803 &descriptor->map_len);
804
805 if ((caddr_t)descriptor->data != MAP_FAILED)
806 {
4bf44c1c 807#if HAVE_POSIX_MADVISE
ea9f10bb
TT
808 posix_madvise (descriptor->map_addr, descriptor->map_len,
809 POSIX_MADV_WILLNEED);
4bf44c1c 810#endif
ea9f10bb
TT
811 goto done;
812 }
4bf44c1c 813
ea9f10bb
TT
814 /* On failure, clear out the section data and try again. */
815 memset (descriptor, 0, sizeof (*descriptor));
816 }
817 }
4bf44c1c
TT
818#endif /* HAVE_MMAP */
819
ea9f10bb
TT
820 /* Handle compressed sections, or ordinary uncompressed sections in
821 the no-mmap case. */
4bf44c1c 822
fd361982 823 descriptor->size = bfd_section_size (sectp);
ea9f10bb 824 descriptor->data = NULL;
4bf44c1c 825
ea9f10bb
TT
826 data = NULL;
827 if (!bfd_get_full_section_contents (abfd, sectp, &data))
41667530
MG
828 {
829 warning (_("Can't read data for section '%s' in file '%s'"),
fd361982 830 bfd_section_name (sectp),
41667530
MG
831 bfd_get_filename (abfd));
832 /* Set size to 0 to prevent further attempts to read the invalid
833 section. */
834 *size = 0;
cafb3438 835 return NULL;
41667530 836 }
ea9f10bb 837 descriptor->data = data;
4bf44c1c
TT
838
839 done:
840 gdb_assert (descriptor->data != NULL);
841 *size = descriptor->size;
9a3c8263 842 return (const gdb_byte *) descriptor->data;
4bf44c1c 843}
64c31149 844
dccee2de
TT
845/* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
846 return 1. Otherwise print a warning and return 0. ABFD seek position is
847 not preserved. */
848
849static int
850get_file_crc (bfd *abfd, unsigned long *file_crc_return)
851{
df2fc6fb 852 uint32_t file_crc = 0;
dccee2de
TT
853
854 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
855 {
856 warning (_("Problem reading \"%s\" for CRC: %s"),
857 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
858 return 0;
859 }
860
861 for (;;)
862 {
863 gdb_byte buffer[8 * 1024];
864 bfd_size_type count;
865
226f9f4f 866 count = bfd_read (buffer, sizeof (buffer), abfd);
dccee2de
TT
867 if (count == (bfd_size_type) -1)
868 {
869 warning (_("Problem reading \"%s\" for CRC: %s"),
870 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
871 return 0;
872 }
873 if (count == 0)
874 break;
875 file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
876 }
877
878 *file_crc_return = file_crc;
879 return 1;
880}
881
882/* See gdb_bfd.h. */
883
884int
885gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
886{
9a3c8263 887 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
dccee2de
TT
888
889 if (!gdata->crc_computed)
890 gdata->crc_computed = get_file_crc (abfd, &gdata->crc);
891
892 if (gdata->crc_computed)
893 *crc_out = gdata->crc;
894 return gdata->crc_computed;
895}
896
64c31149
TT
897\f
898
899/* See gdb_bfd.h. */
900
192b62ce 901gdb_bfd_ref_ptr
64c31149
TT
902gdb_bfd_fopen (const char *filename, const char *target, const char *mode,
903 int fd)
904{
905 bfd *result = bfd_fopen (filename, target, mode, fd);
906
0ecf4403
TT
907 if (result != nullptr)
908 bfd_set_cacheable (result, 1);
909
1831a9f9 910 return gdb_bfd_ref_ptr::new_reference (result);
64c31149
TT
911}
912
913/* See gdb_bfd.h. */
914
192b62ce 915gdb_bfd_ref_ptr
64c31149
TT
916gdb_bfd_openr (const char *filename, const char *target)
917{
918 bfd *result = bfd_openr (filename, target);
919
1831a9f9 920 return gdb_bfd_ref_ptr::new_reference (result);
64c31149
TT
921}
922
923/* See gdb_bfd.h. */
924
192b62ce 925gdb_bfd_ref_ptr
64c31149
TT
926gdb_bfd_openw (const char *filename, const char *target)
927{
928 bfd *result = bfd_openw (filename, target);
929
1831a9f9 930 return gdb_bfd_ref_ptr::new_reference (result);
64c31149
TT
931}
932
933/* See gdb_bfd.h. */
934
bb75a869
TT
935gdb_bfd_ref_ptr
936gdb_bfd_openr_iovec (const char *filename, const char *target,
937 gdb_iovec_opener_ftype open_fn)
938{
939 auto do_open = [] (bfd *nbfd, void *closure) -> void *
940 {
941 auto real_opener = static_cast<gdb_iovec_opener_ftype *> (closure);
942 return (*real_opener) (nbfd);
943 };
944
945 auto read_trampoline = [] (bfd *nbfd, void *stream, void *buf,
946 file_ptr nbytes, file_ptr offset) -> file_ptr
947 {
948 gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
949 return obj->read (nbfd, buf, nbytes, offset);
950 };
951
952 auto stat_trampoline = [] (struct bfd *abfd, void *stream,
953 struct stat *sb) -> int
954 {
955 gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
956 return obj->stat (abfd, sb);
957 };
958
959 auto close_trampoline = [] (struct bfd *nbfd, void *stream) -> int
960 {
961 gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
962 delete obj;
963 /* Success. */
964 return 0;
965 };
966
967 bfd *result = bfd_openr_iovec (filename, target,
968 do_open, &open_fn,
969 read_trampoline, close_trampoline,
970 stat_trampoline);
971
972 return gdb_bfd_ref_ptr::new_reference (result);
973}
974
975/* See gdb_bfd.h. */
976
0cd61f44
TT
977void
978gdb_bfd_mark_parent (bfd *child, bfd *parent)
979{
980 struct gdb_bfd_data *gdata;
981
982 gdb_bfd_ref (child);
983 /* No need to stash the filename here, because we also keep a
984 reference on the parent archive. */
985
9a3c8263 986 gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
0cd61f44
TT
987 if (gdata->archive_bfd == NULL)
988 {
989 gdata->archive_bfd = parent;
990 gdb_bfd_ref (parent);
991 }
992 else
993 gdb_assert (gdata->archive_bfd == parent);
994}
995
996/* See gdb_bfd.h. */
997
192b62ce 998gdb_bfd_ref_ptr
64c31149
TT
999gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
1000{
1001 bfd *result = bfd_openr_next_archived_file (archive, previous);
1002
1003 if (result)
0cd61f44 1004 gdb_bfd_mark_parent (result, archive);
64c31149 1005
192b62ce 1006 return gdb_bfd_ref_ptr (result);
64c31149
TT
1007}
1008
1009/* See gdb_bfd.h. */
1010
13aaf454
DE
1011void
1012gdb_bfd_record_inclusion (bfd *includer, bfd *includee)
1013{
1014 struct gdb_bfd_data *gdata;
1015
9a3c8263 1016 gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
1831a9f9 1017 gdata->included_bfds.push_back (gdb_bfd_ref_ptr::new_reference (includee));
13aaf454
DE
1018}
1019
d6b28940
TT
1020\f
1021
69f6730d 1022static_assert (ARRAY_SIZE (_bfd_std_section) == 4);
65cf3563
TT
1023
1024/* See gdb_bfd.h. */
1025
1026int
1027gdb_bfd_section_index (bfd *abfd, asection *section)
1028{
1029 if (section == NULL)
1030 return -1;
1031 else if (section == bfd_com_section_ptr)
ce9c0ca1 1032 return bfd_count_sections (abfd);
65cf3563 1033 else if (section == bfd_und_section_ptr)
ce9c0ca1 1034 return bfd_count_sections (abfd) + 1;
65cf3563 1035 else if (section == bfd_abs_section_ptr)
ce9c0ca1 1036 return bfd_count_sections (abfd) + 2;
65cf3563 1037 else if (section == bfd_ind_section_ptr)
ce9c0ca1 1038 return bfd_count_sections (abfd) + 3;
65cf3563
TT
1039 return section->index;
1040}
1041
1042/* See gdb_bfd.h. */
1043
1044int
1045gdb_bfd_count_sections (bfd *abfd)
1046{
1047 return bfd_count_sections (abfd) + 4;
1048}
1049
1da77581
TT
1050/* See gdb_bfd.h. */
1051
1052int
1053gdb_bfd_requires_relocations (bfd *abfd)
1054{
9a3c8263 1055 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1da77581
TT
1056
1057 if (gdata->relocation_computed == 0)
1058 {
1059 asection *sect;
1060
1061 for (sect = abfd->sections; sect != NULL; sect = sect->next)
1062 if ((sect->flags & SEC_RELOC) != 0)
1063 {
1064 gdata->needs_relocations = 1;
1065 break;
1066 }
1067
1068 gdata->relocation_computed = 1;
1069 }
1070
1071 return gdata->needs_relocations;
1072}
1073
e0fc5c3f
SM
1074/* See gdb_bfd.h. */
1075
1076bool
1077gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
1078 gdb::byte_vector *contents)
1079{
1080 bfd_size_type section_size = bfd_section_size (section);
1081
1082 contents->resize (section_size);
1083
1084 return bfd_get_section_contents (abfd, section, contents->data (), 0,
1085 section_size);
1086}
65cf3563 1087
34b965f7
TT
1088#define AMBIGUOUS_MESS1 ".\nMatching formats:"
1089#define AMBIGUOUS_MESS2 \
1090 ".\nUse \"set gnutarget format-name\" to specify the format."
1091
1092/* See gdb_bfd.h. */
1093
1094std::string
1095gdb_bfd_errmsg (bfd_error_type error_tag, char **matching)
1096{
1097 char **p;
1098
1099 /* Check if errmsg just need simple return. */
1100 if (error_tag != bfd_error_file_ambiguously_recognized || matching == NULL)
1101 return bfd_errmsg (error_tag);
1102
1103 std::string ret (bfd_errmsg (error_tag));
1104 ret += AMBIGUOUS_MESS1;
1105
1106 for (p = matching; *p; p++)
1107 {
1108 ret += " ";
1109 ret += *p;
1110 }
1111 ret += AMBIGUOUS_MESS2;
1112
1113 xfree (matching);
1114
1115 return ret;
1116}
1117
d6b28940
TT
1118/* A callback for htab_traverse that prints a single BFD. */
1119
1120static int
1121print_one_bfd (void **slot, void *data)
1122{
9a3c8263
SM
1123 bfd *abfd = (struct bfd *) *slot;
1124 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1125 struct ui_out *uiout = (struct ui_out *) data;
d6b28940 1126
2e783024 1127 ui_out_emit_tuple tuple_emitter (uiout, NULL);
381befee 1128 uiout->field_signed ("refcount", gdata->refc);
112e8700 1129 uiout->field_string ("addr", host_address_to_string (abfd));
972f7a4b
TT
1130 uiout->field_string ("filename", bfd_get_filename (abfd),
1131 file_name_style.style ());
112e8700 1132 uiout->text ("\n");
d6b28940
TT
1133
1134 return 1;
1135}
1136
1137/* Implement the 'maint info bfd' command. */
1138
1139static void
e4e33335 1140maintenance_info_bfds (const char *arg, int from_tty)
d6b28940 1141{
d6b28940
TT
1142 struct ui_out *uiout = current_uiout;
1143
4a2b031d 1144 ui_out_emit_table table_emitter (uiout, 3, -1, "bfds");
112e8700
SM
1145 uiout->table_header (10, ui_left, "refcount", "Refcount");
1146 uiout->table_header (18, ui_left, "addr", "Address");
1147 uiout->table_header (40, ui_left, "filename", "Filename");
d6b28940 1148
112e8700 1149 uiout->table_body ();
d6b28940 1150 htab_traverse (all_bfds, print_one_bfd, uiout);
d6b28940
TT
1151}
1152
84e60555
KB
1153/* BFD related per-inferior data. */
1154
1155struct bfd_inferior_data
1156{
1157 std::unordered_map<std::string, unsigned long> bfd_error_string_counts;
1158};
1159
1160/* Per-inferior data key. */
1161
1162static const registry<inferior>::key<bfd_inferior_data> bfd_inferior_data_key;
1163
1164/* Fetch per-inferior BFD data. It always returns a valid pointer to
1165 a bfd_inferior_data struct. */
1166
1167static struct bfd_inferior_data *
1168get_bfd_inferior_data (struct inferior *inf)
1169{
1170 struct bfd_inferior_data *data;
1171
1172 data = bfd_inferior_data_key.get (inf);
1173 if (data == nullptr)
1174 data = bfd_inferior_data_key.emplace (inf);
1175
1176 return data;
1177}
1178
1179/* Increment the BFD error count for STR and return the updated
1180 count. */
1181
1182static unsigned long
e8cd90f0 1183increment_bfd_error_count (const std::string &str)
84e60555 1184{
e8cd90f0
TT
1185#if CXX_STD_THREAD
1186 std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
1187#endif
84e60555
KB
1188 struct bfd_inferior_data *bid = get_bfd_inferior_data (current_inferior ());
1189
1190 auto &map = bid->bfd_error_string_counts;
e8cd90f0 1191 return ++map[str];
84e60555
KB
1192}
1193
e8cd90f0
TT
1194/* A print callback for bfd_print_error. */
1195
5cb1d84e 1196static int ATTRIBUTE_PRINTF (2, 0)
e8cd90f0
TT
1197print_error_callback (void *stream, const char *fmt, ...)
1198{
1199 string_file *file = (string_file *) stream;
1200 size_t in_size = file->size ();
1201 va_list ap;
1202 va_start (ap, fmt);
1203 file->vprintf (fmt, ap);
1204 va_end (ap);
1205 return file->size () - in_size;
1206}
84e60555
KB
1207
1208/* Define a BFD error handler which will suppress the printing of
1209 messages which have been printed once already. This is done on a
1210 per-inferior basis. */
1211
5cb1d84e 1212static void
84e60555
KB
1213gdb_bfd_error_handler (const char *fmt, va_list ap)
1214{
e8cd90f0
TT
1215 string_file output;
1216 bfd_print_error (print_error_callback, &output, fmt, ap);
1217 std::string str = output.release ();
84e60555 1218
e8cd90f0 1219 if (increment_bfd_error_count (str) > 1)
84e60555
KB
1220 return;
1221
e8cd90f0 1222 warning ("%s", str.c_str ());
84e60555
KB
1223}
1224
da0e2ac4
TT
1225/* See gdb_bfd.h. */
1226
1227void
1228gdb_bfd_init ()
1229{
1230 if (bfd_init () == BFD_INIT_MAGIC)
1231 {
1232#if CXX_STD_THREAD
1233 if (bfd_thread_init (gdb_bfd_lock, gdb_bfd_unlock, nullptr))
1234#endif
1235 return;
1236 }
1237
1238 error (_("fatal error: libbfd ABI mismatch"));
1239}
1240
6c265988 1241void _initialize_gdb_bfd ();
d6b28940 1242void
6c265988 1243_initialize_gdb_bfd ()
d6b28940
TT
1244{
1245 all_bfds = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
1246 NULL, xcalloc, xfree);
1247
1248 add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
1249List the BFDs that are currently open."),
1250 &maintenanceinfolist);
18989b3c
AB
1251
1252 add_setshow_boolean_cmd ("bfd-sharing", no_class,
1253 &bfd_sharing, _("\
1254Set whether gdb will share bfds that appear to be the same file."), _("\
1255Show whether gdb will share bfds that appear to be the same file."), _("\
1256When enabled gdb will reuse existing bfds rather than reopening the\n\
1257same file. To decide if two files are the same then gdb compares the\n\
1258filename, file size, file modification time, and file inode."),
1259 NULL,
1260 &show_bfd_sharing,
1261 &maintenance_set_cmdlist,
1262 &maintenance_show_cmdlist);
566f5e3b 1263
d4dd4fca
SM
1264 add_setshow_boolean_cmd ("bfd-cache", class_maintenance,
1265 &debug_bfd_cache,
1266 _("Set bfd cache debugging."),
1267 _("Show bfd cache debugging."),
1268 _("\
566f5e3b 1269When non-zero, bfd cache specific debugging is enabled."),
d4dd4fca
SM
1270 NULL,
1271 &show_bfd_cache_debug,
1272 &setdebuglist, &showdebuglist);
84e60555
KB
1273
1274 /* Hook the BFD error/warning handler to limit amount of output. */
e8cd90f0 1275 bfd_set_error_handler (gdb_bfd_error_handler);
d6b28940 1276}