]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdb_bfd.c
Update copyright year range in all GDB files
[thirdparty/binutils-gdb.git] / gdb / gdb_bfd.c
CommitLineData
cbb099e8
TT
1/* Definitions for BFD wrappers used by GDB.
2
3666a048 3 Copyright (C) 2011-2021 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
20#include "defs.h"
21#include "gdb_bfd.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
GB
32#include "target.h"
33#include "gdb/fileio.h"
07c138c8 34#include "inferior.h"
4bf44c1c
TT
35
36/* An object of this type is stored in the section's user data when
37 mapping a section. */
38
39struct gdb_bfd_section_data
40{
41 /* Size of the data. */
42 bfd_size_type size;
43 /* If the data was mmapped, this is the length of the map. */
44 bfd_size_type map_len;
45 /* The data. If NULL, the section data has not been read. */
46 void *data;
47 /* If the data was mmapped, this is the map address. */
48 void *map_addr;
49};
a4453b7e 50
d6b28940
TT
51/* A hash table holding every BFD that gdb knows about. This is not
52 to be confused with 'gdb_bfd_cache', which is used for sharing
53 BFDs; in contrast, this hash is used just to implement
54 "maint info bfd". */
55
56static htab_t all_bfds;
57
6ec53d05
TT
58/* An object of this type is stored in each BFD's user data. */
59
60struct gdb_bfd_data
61{
3cae4447
TT
62 /* Note that if ST is nullptr, then we simply fill in zeroes. */
63 gdb_bfd_data (bfd *abfd, struct stat *st)
64 : mtime (st == nullptr ? 0 : st->st_mtime),
65 size (st == nullptr ? 0 : st->st_size),
66 inode (st == nullptr ? 0 : st->st_ino),
67 device_id (st == nullptr ? 0 : st->st_dev),
06d5bbc8
TT
68 relocation_computed (0),
69 needs_relocations (0),
70 crc_computed (0)
71 {
06d5bbc8
TT
72 }
73
74 ~gdb_bfd_data ()
75 {
06d5bbc8
TT
76 }
77
6ec53d05 78 /* The reference count. */
06d5bbc8 79 int refc = 1;
6ec53d05
TT
80
81 /* The mtime of the BFD at the point the cache entry was made. */
82 time_t mtime;
b82d08cd 83
c04fe68f
AB
84 /* The file size (in bytes) at the point the cache entry was made. */
85 off_t size;
86
87 /* The inode of the file at the point the cache entry was made. */
88 ino_t inode;
89
90 /* The device id of the file at the point the cache entry was made. */
91 dev_t device_id;
92
1da77581
TT
93 /* This is true if we have determined whether this BFD has any
94 sections requiring relocation. */
95 unsigned int relocation_computed : 1;
96
97 /* This is true if any section needs relocation. */
98 unsigned int needs_relocations : 1;
99
dccee2de
TT
100 /* This is true if we have successfully computed the file's CRC. */
101 unsigned int crc_computed : 1;
102
103 /* The file's CRC. */
06d5bbc8 104 unsigned long crc = 0;
dccee2de 105
b82d08cd
TT
106 /* If the BFD comes from an archive, this points to the archive's
107 BFD. Otherwise, this is NULL. */
06d5bbc8 108 bfd *archive_bfd = nullptr;
e992eda4 109
13aaf454 110 /* Table of all the bfds this bfd has included. */
d5833c62 111 std::vector<gdb_bfd_ref_ptr> included_bfds;
13aaf454 112
e992eda4 113 /* The registry. */
06d5bbc8 114 REGISTRY_FIELDS = {};
6ec53d05
TT
115};
116
e992eda4
TT
117#define GDB_BFD_DATA_ACCESSOR(ABFD) \
118 ((struct gdb_bfd_data *) bfd_usrdata (ABFD))
119
120DEFINE_REGISTRY (bfd, GDB_BFD_DATA_ACCESSOR)
121
6ec53d05
TT
122/* A hash table storing all the BFDs maintained in the cache. */
123
124static htab_t gdb_bfd_cache;
125
18989b3c
AB
126/* When true gdb will reuse an existing bfd object if the filename,
127 modification time, and file size all match. */
128
491144b5 129static bool bfd_sharing = true;
18989b3c
AB
130static void
131show_bfd_sharing (struct ui_file *file, int from_tty,
132 struct cmd_list_element *c, const char *value)
133{
134 fprintf_filtered (file, _("BFD sharing is %s.\n"), value);
135}
136
566f5e3b
AB
137/* When non-zero debugging of the bfd caches is enabled. */
138
139static unsigned int debug_bfd_cache;
140static void
141show_bfd_cache_debug (struct ui_file *file, int from_tty,
142 struct cmd_list_element *c, const char *value)
143{
144 fprintf_filtered (file, _("BFD cache debugging is %s.\n"), value);
145}
146
6ec53d05
TT
147/* The type of an object being looked up in gdb_bfd_cache. We use
148 htab's capability of storing one kind of object (BFD in this case)
149 and using a different sort of object for searching. */
150
151struct gdb_bfd_cache_search
152{
153 /* The filename. */
154 const char *filename;
155 /* The mtime. */
156 time_t mtime;
c04fe68f
AB
157 /* The file size (in bytes). */
158 off_t size;
159 /* The inode of the file. */
160 ino_t inode;
161 /* The device id of the file. */
162 dev_t device_id;
6ec53d05
TT
163};
164
165/* A hash function for BFDs. */
166
167static hashval_t
168hash_bfd (const void *b)
169{
9a3c8263 170 const bfd *abfd = (const struct bfd *) b;
6ec53d05
TT
171
172 /* It is simplest to just hash the filename. */
173 return htab_hash_string (bfd_get_filename (abfd));
174}
175
176/* An equality function for BFDs. Note that this expects the caller
177 to search using struct gdb_bfd_cache_search only, not BFDs. */
178
179static int
180eq_bfd (const void *a, const void *b)
181{
9a3c8263
SM
182 const bfd *abfd = (const struct bfd *) a;
183 const struct gdb_bfd_cache_search *s
184 = (const struct gdb_bfd_cache_search *) b;
185 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
6ec53d05
TT
186
187 return (gdata->mtime == s->mtime
c04fe68f
AB
188 && gdata->size == s->size
189 && gdata->inode == s->inode
190 && gdata->device_id == s->device_id
6ec53d05
TT
191 && strcmp (bfd_get_filename (abfd), s->filename) == 0);
192}
193
194/* See gdb_bfd.h. */
195
f08e97fe
GB
196int
197is_target_filename (const char *name)
198{
199 return startswith (name, TARGET_SYSROOT_PREFIX);
200}
201
202/* See gdb_bfd.h. */
203
204int
205gdb_bfd_has_target_filename (struct bfd *abfd)
206{
207 return is_target_filename (bfd_get_filename (abfd));
208}
209
15cc148f
MS
210/* For `gdb_bfd_open_from_target_memory`. */
211
212struct target_buffer
213{
214 CORE_ADDR base;
215 ULONGEST size;
216};
217
218/* For `gdb_bfd_open_from_target_memory`. Opening the file is a no-op. */
219
220static void *
221mem_bfd_iovec_open (struct bfd *abfd, void *open_closure)
222{
223 return open_closure;
224}
225
226/* For `gdb_bfd_open_from_target_memory`. Closing the file is just freeing the
227 base/size pair on our side. */
228
229static int
230mem_bfd_iovec_close (struct bfd *abfd, void *stream)
231{
232 xfree (stream);
233
234 /* Zero means success. */
235 return 0;
236}
237
238/* For `gdb_bfd_open_from_target_memory`. For reading the file, we just need to
239 pass through to target_read_memory and fix up the arguments and return
240 values. */
241
242static file_ptr
243mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
244 file_ptr nbytes, file_ptr offset)
245{
246 int err;
247 struct target_buffer *buffer = (struct target_buffer *) stream;
248
249 /* If this read will read all of the file, limit it to just the rest. */
250 if (offset + nbytes > buffer->size)
251 nbytes = buffer->size - offset;
252
253 /* If there are no more bytes left, we've reached EOF. */
254 if (nbytes == 0)
255 return 0;
256
257 err = target_read_memory (buffer->base + offset, (gdb_byte *) buf, nbytes);
258 if (err)
259 return -1;
260
261 return nbytes;
262}
263
264/* For `gdb_bfd_open_from_target_memory`. For statting the file, we only
265 support the st_size attribute. */
266
267static int
268mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
269{
270 struct target_buffer *buffer = (struct target_buffer*) stream;
271
272 memset (sb, 0, sizeof (struct stat));
273 sb->st_size = buffer->size;
274 return 0;
275}
276
277/* See gdb_bfd.h. */
278
279gdb_bfd_ref_ptr
280gdb_bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
281 const char *target,
282 const char *filename)
283{
284 struct target_buffer *buffer = XNEW (struct target_buffer);
285
286 buffer->base = addr;
287 buffer->size = size;
288 return gdb_bfd_openr_iovec (filename ? filename : "<in-memory>", target,
289 mem_bfd_iovec_open,
290 buffer,
291 mem_bfd_iovec_pread,
292 mem_bfd_iovec_close,
293 mem_bfd_iovec_stat);
294}
f08e97fe
GB
295
296/* Return the system error number corresponding to ERRNUM. */
297
298static int
299fileio_errno_to_host (int errnum)
300{
301 switch (errnum)
302 {
303 case FILEIO_EPERM:
dda83cd7 304 return EPERM;
f08e97fe 305 case FILEIO_ENOENT:
dda83cd7 306 return ENOENT;
f08e97fe 307 case FILEIO_EINTR:
dda83cd7 308 return EINTR;
f08e97fe 309 case FILEIO_EIO:
dda83cd7 310 return EIO;
f08e97fe 311 case FILEIO_EBADF:
dda83cd7 312 return EBADF;
f08e97fe 313 case FILEIO_EACCES:
dda83cd7 314 return EACCES;
f08e97fe 315 case FILEIO_EFAULT:
dda83cd7 316 return EFAULT;
f08e97fe 317 case FILEIO_EBUSY:
dda83cd7 318 return EBUSY;
f08e97fe 319 case FILEIO_EEXIST:
dda83cd7 320 return EEXIST;
f08e97fe 321 case FILEIO_ENODEV:
dda83cd7 322 return ENODEV;
f08e97fe 323 case FILEIO_ENOTDIR:
dda83cd7 324 return ENOTDIR;
f08e97fe 325 case FILEIO_EISDIR:
dda83cd7 326 return EISDIR;
f08e97fe 327 case FILEIO_EINVAL:
dda83cd7 328 return EINVAL;
f08e97fe 329 case FILEIO_ENFILE:
dda83cd7 330 return ENFILE;
f08e97fe 331 case FILEIO_EMFILE:
dda83cd7 332 return EMFILE;
f08e97fe 333 case FILEIO_EFBIG:
dda83cd7 334 return EFBIG;
f08e97fe 335 case FILEIO_ENOSPC:
dda83cd7 336 return ENOSPC;
f08e97fe 337 case FILEIO_ESPIPE:
dda83cd7 338 return ESPIPE;
f08e97fe 339 case FILEIO_EROFS:
dda83cd7 340 return EROFS;
f08e97fe 341 case FILEIO_ENOSYS:
dda83cd7 342 return ENOSYS;
f08e97fe 343 case FILEIO_ENAMETOOLONG:
dda83cd7 344 return ENAMETOOLONG;
f08e97fe
GB
345 }
346 return -1;
347}
348
98c59b52
PA
349/* bfd_openr_iovec OPEN_CLOSURE data for gdb_bfd_open. */
350struct gdb_bfd_open_closure
351{
352 inferior *inf;
353 bool warn_if_slow;
354};
355
f08e97fe 356/* Wrapper for target_fileio_open suitable for passing as the
98c59b52 357 OPEN_FUNC argument to gdb_bfd_openr_iovec. */
f08e97fe
GB
358
359static void *
98c59b52 360gdb_bfd_iovec_fileio_open (struct bfd *abfd, void *open_closure)
f08e97fe
GB
361{
362 const char *filename = bfd_get_filename (abfd);
363 int fd, target_errno;
364 int *stream;
98c59b52 365 gdb_bfd_open_closure *oclosure = (gdb_bfd_open_closure *) open_closure;
f08e97fe
GB
366
367 gdb_assert (is_target_filename (filename));
368
98c59b52 369 fd = target_fileio_open (oclosure->inf,
4111f652 370 filename + strlen (TARGET_SYSROOT_PREFIX),
98c59b52 371 FILEIO_O_RDONLY, 0, oclosure->warn_if_slow,
4111f652 372 &target_errno);
f08e97fe
GB
373 if (fd == -1)
374 {
375 errno = fileio_errno_to_host (target_errno);
376 bfd_set_error (bfd_error_system_call);
377 return NULL;
378 }
379
380 stream = XCNEW (int);
381 *stream = fd;
382 return stream;
383}
384
385/* Wrapper for target_fileio_pread suitable for passing as the
386 PREAD_FUNC argument to gdb_bfd_openr_iovec. */
387
388static file_ptr
389gdb_bfd_iovec_fileio_pread (struct bfd *abfd, void *stream, void *buf,
390 file_ptr nbytes, file_ptr offset)
391{
392 int fd = *(int *) stream;
393 int target_errno;
394 file_ptr pos, bytes;
395
396 pos = 0;
397 while (nbytes > pos)
398 {
2d7711a3
GB
399 QUIT;
400
f08e97fe
GB
401 bytes = target_fileio_pread (fd, (gdb_byte *) buf + pos,
402 nbytes - pos, offset + pos,
403 &target_errno);
404 if (bytes == 0)
dda83cd7
SM
405 /* Success, but no bytes, means end-of-file. */
406 break;
f08e97fe
GB
407 if (bytes == -1)
408 {
409 errno = fileio_errno_to_host (target_errno);
410 bfd_set_error (bfd_error_system_call);
411 return -1;
412 }
413
414 pos += bytes;
415 }
416
417 return pos;
418}
419
420/* Wrapper for target_fileio_close suitable for passing as the
421 CLOSE_FUNC argument to gdb_bfd_openr_iovec. */
422
423static int
424gdb_bfd_iovec_fileio_close (struct bfd *abfd, void *stream)
425{
426 int fd = *(int *) stream;
427 int target_errno;
428
429 xfree (stream);
430
431 /* Ignore errors on close. These may happen with remote
432 targets if the connection has already been torn down. */
433 target_fileio_close (fd, &target_errno);
434
435 /* Zero means success. */
436 return 0;
437}
438
439/* Wrapper for target_fileio_fstat suitable for passing as the
440 STAT_FUNC argument to gdb_bfd_openr_iovec. */
441
442static int
443gdb_bfd_iovec_fileio_fstat (struct bfd *abfd, void *stream,
444 struct stat *sb)
445{
446 int fd = *(int *) stream;
447 int target_errno;
448 int result;
449
450 result = target_fileio_fstat (fd, sb, &target_errno);
451 if (result == -1)
452 {
453 errno = fileio_errno_to_host (target_errno);
454 bfd_set_error (bfd_error_system_call);
455 }
456
457 return result;
458}
459
3cae4447
TT
460/* A helper function to initialize the data that gdb attaches to each
461 BFD. */
462
463static void
464gdb_bfd_init_data (struct bfd *abfd, struct stat *st)
465{
466 struct gdb_bfd_data *gdata;
467 void **slot;
468
469 gdb_assert (bfd_usrdata (abfd) == nullptr);
470
471 /* Ask BFD to decompress sections in bfd_get_full_section_contents. */
472 abfd->flags |= BFD_DECOMPRESS;
473
474 gdata = new gdb_bfd_data (abfd, st);
475 bfd_set_usrdata (abfd, gdata);
476 bfd_alloc_data (abfd);
477
478 /* This is the first we've seen it, so add it to the hash table. */
479 slot = htab_find_slot (all_bfds, abfd, INSERT);
480 gdb_assert (slot && !*slot);
481 *slot = abfd;
482}
483
f08e97fe
GB
484/* See gdb_bfd.h. */
485
192b62ce 486gdb_bfd_ref_ptr
98c59b52
PA
487gdb_bfd_open (const char *name, const char *target, int fd,
488 bool warn_if_slow)
6ec53d05
TT
489{
490 hashval_t hash;
491 void **slot;
492 bfd *abfd;
493 struct gdb_bfd_cache_search search;
494 struct stat st;
495
f08e97fe
GB
496 if (is_target_filename (name))
497 {
498 if (!target_filesystem_is_local ())
499 {
500 gdb_assert (fd == -1);
501
98c59b52 502 gdb_bfd_open_closure open_closure { current_inferior (), warn_if_slow };
e3dd7556 503 return gdb_bfd_openr_iovec (name, target,
07c138c8 504 gdb_bfd_iovec_fileio_open,
98c59b52 505 &open_closure,
f08e97fe
GB
506 gdb_bfd_iovec_fileio_pread,
507 gdb_bfd_iovec_fileio_close,
508 gdb_bfd_iovec_fileio_fstat);
f08e97fe
GB
509 }
510
511 name += strlen (TARGET_SYSROOT_PREFIX);
512 }
513
6ec53d05
TT
514 if (gdb_bfd_cache == NULL)
515 gdb_bfd_cache = htab_create_alloc (1, hash_bfd, eq_bfd, NULL,
516 xcalloc, xfree);
517
518 if (fd == -1)
519 {
614c279d 520 fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0);
6ec53d05
TT
521 if (fd == -1)
522 {
523 bfd_set_error (bfd_error_system_call);
524 return NULL;
525 }
526 }
527
6ec53d05
TT
528 if (fstat (fd, &st) < 0)
529 {
3cae4447
TT
530 /* Weird situation here -- don't cache if we can't stat. */
531 if (debug_bfd_cache)
532 fprintf_unfiltered (gdb_stdlog,
03b0a45f
TT
533 "Could not stat %s - not caching\n",
534 name);
535 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
536 if (abfd == nullptr)
537 return nullptr;
3cae4447 538 return gdb_bfd_ref_ptr::new_reference (abfd);
c04fe68f 539 }
6ec53d05 540
3cae4447
TT
541 search.filename = name;
542 search.mtime = st.st_mtime;
543 search.size = st.st_size;
544 search.inode = st.st_ino;
545 search.device_id = st.st_dev;
546
6ec53d05
TT
547 /* Note that this must compute the same result as hash_bfd. */
548 hash = htab_hash_string (name);
549 /* Note that we cannot use htab_find_slot_with_hash here, because
550 opening the BFD may fail; and this would violate hashtab
551 invariants. */
9a3c8263 552 abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
18989b3c 553 if (bfd_sharing && abfd != NULL)
6ec53d05 554 {
566f5e3b
AB
555 if (debug_bfd_cache)
556 fprintf_unfiltered (gdb_stdlog,
557 "Reusing cached bfd %s for %s\n",
558 host_address_to_string (abfd),
559 bfd_get_filename (abfd));
6ec53d05 560 close (fd);
1831a9f9 561 return gdb_bfd_ref_ptr::new_reference (abfd);
6ec53d05
TT
562 }
563
564 abfd = bfd_fopen (name, target, FOPEN_RB, fd);
565 if (abfd == NULL)
566 return NULL;
567
566f5e3b
AB
568 if (debug_bfd_cache)
569 fprintf_unfiltered (gdb_stdlog,
570 "Creating new bfd %s for %s\n",
571 host_address_to_string (abfd),
572 bfd_get_filename (abfd));
573
18989b3c
AB
574 if (bfd_sharing)
575 {
576 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
577 gdb_assert (!*slot);
578 *slot = abfd;
579 }
6ec53d05 580
3cae4447
TT
581 /* It's important to pass the already-computed stat info here,
582 rather than, say, calling gdb_bfd_ref_ptr::new_reference. BFD by
583 default will "stat" the file each time bfd_get_mtime is called --
584 and since we already entered it into the hash table using this
585 mtime, if the file changed at the wrong moment, the race would
586 lead to a hash table corruption. */
587 gdb_bfd_init_data (abfd, &st);
588 return gdb_bfd_ref_ptr (abfd);
6ec53d05
TT
589}
590
4bf44c1c
TT
591/* A helper function that releases any section data attached to the
592 BFD. */
593
594static void
1ce51eb5 595free_one_bfd_section (asection *sectp)
4bf44c1c 596{
9a3c8263 597 struct gdb_bfd_section_data *sect
fd361982 598 = (struct gdb_bfd_section_data *) bfd_section_userdata (sectp);
4bf44c1c
TT
599
600 if (sect != NULL && sect->data != NULL)
601 {
602#ifdef HAVE_MMAP
603 if (sect->map_addr != NULL)
604 {
605 int res;
606
607 res = munmap (sect->map_addr, sect->map_len);
608 gdb_assert (res == 0);
609 }
610 else
611#endif
612 xfree (sect->data);
613 }
614}
615
cbb099e8
TT
616/* Close ABFD, and warn if that fails. */
617
618static int
619gdb_bfd_close_or_warn (struct bfd *abfd)
620{
621 int ret;
b16c44de 622 const char *name = bfd_get_filename (abfd);
cbb099e8 623
1ce51eb5
TT
624 for (asection *sect : gdb_bfd_sections (abfd))
625 free_one_bfd_section (sect);
4bf44c1c 626
cbb099e8
TT
627 ret = bfd_close (abfd);
628
629 if (!ret)
630 warning (_("cannot close \"%s\": %s"),
631 name, bfd_errmsg (bfd_get_error ()));
632
633 return ret;
634}
635
596f7d67 636/* See gdb_bfd.h. */
cbb099e8 637
520b0001 638void
cbb099e8
TT
639gdb_bfd_ref (struct bfd *abfd)
640{
6ec53d05 641 struct gdb_bfd_data *gdata;
cbb099e8
TT
642
643 if (abfd == NULL)
520b0001 644 return;
cbb099e8 645
9a3c8263 646 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
cbb099e8 647
566f5e3b
AB
648 if (debug_bfd_cache)
649 fprintf_unfiltered (gdb_stdlog,
650 "Increase reference count on bfd %s (%s)\n",
651 host_address_to_string (abfd),
652 bfd_get_filename (abfd));
653
6ec53d05 654 if (gdata != NULL)
cbb099e8 655 {
6ec53d05 656 gdata->refc += 1;
520b0001 657 return;
cbb099e8
TT
658 }
659
3cae4447
TT
660 /* Caching only happens via gdb_bfd_open, so passing nullptr here is
661 fine. */
662 gdb_bfd_init_data (abfd, nullptr);
cbb099e8
TT
663}
664
596f7d67 665/* See gdb_bfd.h. */
cbb099e8
TT
666
667void
668gdb_bfd_unref (struct bfd *abfd)
669{
6ec53d05
TT
670 struct gdb_bfd_data *gdata;
671 struct gdb_bfd_cache_search search;
06d5bbc8 672 bfd *archive_bfd;
cbb099e8
TT
673
674 if (abfd == NULL)
675 return;
676
9a3c8263 677 gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
6ec53d05 678 gdb_assert (gdata->refc >= 1);
cbb099e8 679
6ec53d05
TT
680 gdata->refc -= 1;
681 if (gdata->refc > 0)
566f5e3b
AB
682 {
683 if (debug_bfd_cache)
684 fprintf_unfiltered (gdb_stdlog,
685 "Decrease reference count on bfd %s (%s)\n",
686 host_address_to_string (abfd),
687 bfd_get_filename (abfd));
688 return;
689 }
690
691 if (debug_bfd_cache)
692 fprintf_unfiltered (gdb_stdlog,
693 "Delete final reference count on bfd %s (%s)\n",
694 host_address_to_string (abfd),
695 bfd_get_filename (abfd));
cbb099e8 696
b82d08cd 697 archive_bfd = gdata->archive_bfd;
6ec53d05
TT
698 search.filename = bfd_get_filename (abfd);
699
700 if (gdb_bfd_cache && search.filename)
701 {
702 hashval_t hash = htab_hash_string (search.filename);
703 void **slot;
704
705 search.mtime = gdata->mtime;
c04fe68f
AB
706 search.size = gdata->size;
707 search.inode = gdata->inode;
708 search.device_id = gdata->device_id;
6ec53d05
TT
709 slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash,
710 NO_INSERT);
711
712 if (slot && *slot)
713 htab_clear_slot (gdb_bfd_cache, slot);
714 }
715
e992eda4 716 bfd_free_data (abfd);
06d5bbc8 717 delete gdata;
00f93c44 718 bfd_set_usrdata (abfd, NULL); /* Paranoia. */
cbb099e8 719
d6b28940
TT
720 htab_remove_elt (all_bfds, abfd);
721
cbb099e8 722 gdb_bfd_close_or_warn (abfd);
b82d08cd
TT
723
724 gdb_bfd_unref (archive_bfd);
cbb099e8 725}
4bf44c1c
TT
726
727/* A helper function that returns the section data descriptor
728 associated with SECTION. If no such descriptor exists, a new one
729 is allocated and cleared. */
730
731static struct gdb_bfd_section_data *
732get_section_descriptor (asection *section)
733{
734 struct gdb_bfd_section_data *result;
735
fd361982 736 result = (struct gdb_bfd_section_data *) bfd_section_userdata (section);
4bf44c1c
TT
737
738 if (result == NULL)
739 {
224c3ddb
SM
740 result = ((struct gdb_bfd_section_data *)
741 bfd_zalloc (section->owner, sizeof (*result)));
fd361982 742 bfd_set_section_userdata (section, result);
4bf44c1c
TT
743 }
744
745 return result;
746}
747
4bf44c1c
TT
748/* See gdb_bfd.h. */
749
750const gdb_byte *
751gdb_bfd_map_section (asection *sectp, bfd_size_type *size)
752{
753 bfd *abfd;
4bf44c1c 754 struct gdb_bfd_section_data *descriptor;
ea9f10bb 755 bfd_byte *data;
4bf44c1c
TT
756
757 gdb_assert ((sectp->flags & SEC_RELOC) == 0);
758 gdb_assert (size != NULL);
759
760 abfd = sectp->owner;
761
762 descriptor = get_section_descriptor (sectp);
763
764 /* If the data was already read for this BFD, just reuse it. */
765 if (descriptor->data != NULL)
766 goto done;
767
ea9f10bb
TT
768#ifdef HAVE_MMAP
769 if (!bfd_is_section_compressed (abfd, sectp))
4bf44c1c 770 {
ea9f10bb
TT
771 /* The page size, used when mmapping. */
772 static int pagesize;
4bf44c1c 773
ea9f10bb
TT
774 if (pagesize == 0)
775 pagesize = getpagesize ();
776
777 /* Only try to mmap sections which are large enough: we don't want
778 to waste space due to fragmentation. */
779
fd361982 780 if (bfd_section_size (sectp) > 4 * pagesize)
ea9f10bb 781 {
fd361982 782 descriptor->size = bfd_section_size (sectp);
ea9f10bb
TT
783 descriptor->data = bfd_mmap (abfd, 0, descriptor->size, PROT_READ,
784 MAP_PRIVATE, sectp->filepos,
785 &descriptor->map_addr,
786 &descriptor->map_len);
787
788 if ((caddr_t)descriptor->data != MAP_FAILED)
789 {
4bf44c1c 790#if HAVE_POSIX_MADVISE
ea9f10bb
TT
791 posix_madvise (descriptor->map_addr, descriptor->map_len,
792 POSIX_MADV_WILLNEED);
4bf44c1c 793#endif
ea9f10bb
TT
794 goto done;
795 }
4bf44c1c 796
ea9f10bb
TT
797 /* On failure, clear out the section data and try again. */
798 memset (descriptor, 0, sizeof (*descriptor));
799 }
800 }
4bf44c1c
TT
801#endif /* HAVE_MMAP */
802
ea9f10bb
TT
803 /* Handle compressed sections, or ordinary uncompressed sections in
804 the no-mmap case. */
4bf44c1c 805
fd361982 806 descriptor->size = bfd_section_size (sectp);
ea9f10bb 807 descriptor->data = NULL;
4bf44c1c 808
ea9f10bb
TT
809 data = NULL;
810 if (!bfd_get_full_section_contents (abfd, sectp, &data))
41667530
MG
811 {
812 warning (_("Can't read data for section '%s' in file '%s'"),
fd361982 813 bfd_section_name (sectp),
41667530
MG
814 bfd_get_filename (abfd));
815 /* Set size to 0 to prevent further attempts to read the invalid
816 section. */
817 *size = 0;
cafb3438 818 return NULL;
41667530 819 }
ea9f10bb 820 descriptor->data = data;
4bf44c1c
TT
821
822 done:
823 gdb_assert (descriptor->data != NULL);
824 *size = descriptor->size;
9a3c8263 825 return (const gdb_byte *) descriptor->data;
4bf44c1c 826}
64c31149 827
dccee2de
TT
828/* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
829 return 1. Otherwise print a warning and return 0. ABFD seek position is
830 not preserved. */
831
832static int
833get_file_crc (bfd *abfd, unsigned long *file_crc_return)
834{
835 unsigned long file_crc = 0;
836
837 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
838 {
839 warning (_("Problem reading \"%s\" for CRC: %s"),
840 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
841 return 0;
842 }
843
844 for (;;)
845 {
846 gdb_byte buffer[8 * 1024];
847 bfd_size_type count;
848
849 count = bfd_bread (buffer, sizeof (buffer), abfd);
850 if (count == (bfd_size_type) -1)
851 {
852 warning (_("Problem reading \"%s\" for CRC: %s"),
853 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
854 return 0;
855 }
856 if (count == 0)
857 break;
858 file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
859 }
860
861 *file_crc_return = file_crc;
862 return 1;
863}
864
865/* See gdb_bfd.h. */
866
867int
868gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
869{
9a3c8263 870 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
dccee2de
TT
871
872 if (!gdata->crc_computed)
873 gdata->crc_computed = get_file_crc (abfd, &gdata->crc);
874
875 if (gdata->crc_computed)
876 *crc_out = gdata->crc;
877 return gdata->crc_computed;
878}
879
64c31149
TT
880\f
881
882/* See gdb_bfd.h. */
883
192b62ce 884gdb_bfd_ref_ptr
64c31149
TT
885gdb_bfd_fopen (const char *filename, const char *target, const char *mode,
886 int fd)
887{
888 bfd *result = bfd_fopen (filename, target, mode, fd);
889
1831a9f9 890 return gdb_bfd_ref_ptr::new_reference (result);
64c31149
TT
891}
892
893/* See gdb_bfd.h. */
894
192b62ce 895gdb_bfd_ref_ptr
64c31149
TT
896gdb_bfd_openr (const char *filename, const char *target)
897{
898 bfd *result = bfd_openr (filename, target);
899
1831a9f9 900 return gdb_bfd_ref_ptr::new_reference (result);
64c31149
TT
901}
902
903/* See gdb_bfd.h. */
904
192b62ce 905gdb_bfd_ref_ptr
64c31149
TT
906gdb_bfd_openw (const char *filename, const char *target)
907{
908 bfd *result = bfd_openw (filename, target);
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_iovec (const char *filename, const char *target,
917 void *(*open_func) (struct bfd *nbfd,
918 void *open_closure),
919 void *open_closure,
920 file_ptr (*pread_func) (struct bfd *nbfd,
921 void *stream,
922 void *buf,
923 file_ptr nbytes,
924 file_ptr offset),
925 int (*close_func) (struct bfd *nbfd,
926 void *stream),
927 int (*stat_func) (struct bfd *abfd,
928 void *stream,
929 struct stat *sb))
930{
931 bfd *result = bfd_openr_iovec (filename, target,
932 open_func, open_closure,
933 pread_func, close_func, stat_func);
934
1831a9f9 935 return gdb_bfd_ref_ptr::new_reference (result);
64c31149
TT
936}
937
938/* See gdb_bfd.h. */
939
0cd61f44
TT
940void
941gdb_bfd_mark_parent (bfd *child, bfd *parent)
942{
943 struct gdb_bfd_data *gdata;
944
945 gdb_bfd_ref (child);
946 /* No need to stash the filename here, because we also keep a
947 reference on the parent archive. */
948
9a3c8263 949 gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
0cd61f44
TT
950 if (gdata->archive_bfd == NULL)
951 {
952 gdata->archive_bfd = parent;
953 gdb_bfd_ref (parent);
954 }
955 else
956 gdb_assert (gdata->archive_bfd == parent);
957}
958
959/* See gdb_bfd.h. */
960
192b62ce 961gdb_bfd_ref_ptr
64c31149
TT
962gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
963{
964 bfd *result = bfd_openr_next_archived_file (archive, previous);
965
966 if (result)
0cd61f44 967 gdb_bfd_mark_parent (result, archive);
64c31149 968
192b62ce 969 return gdb_bfd_ref_ptr (result);
64c31149
TT
970}
971
972/* See gdb_bfd.h. */
973
13aaf454
DE
974void
975gdb_bfd_record_inclusion (bfd *includer, bfd *includee)
976{
977 struct gdb_bfd_data *gdata;
978
9a3c8263 979 gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
1831a9f9 980 gdata->included_bfds.push_back (gdb_bfd_ref_ptr::new_reference (includee));
13aaf454
DE
981}
982
d6b28940
TT
983\f
984
65cf3563
TT
985gdb_static_assert (ARRAY_SIZE (_bfd_std_section) == 4);
986
987/* See gdb_bfd.h. */
988
989int
990gdb_bfd_section_index (bfd *abfd, asection *section)
991{
992 if (section == NULL)
993 return -1;
994 else if (section == bfd_com_section_ptr)
ce9c0ca1 995 return bfd_count_sections (abfd);
65cf3563 996 else if (section == bfd_und_section_ptr)
ce9c0ca1 997 return bfd_count_sections (abfd) + 1;
65cf3563 998 else if (section == bfd_abs_section_ptr)
ce9c0ca1 999 return bfd_count_sections (abfd) + 2;
65cf3563 1000 else if (section == bfd_ind_section_ptr)
ce9c0ca1 1001 return bfd_count_sections (abfd) + 3;
65cf3563
TT
1002 return section->index;
1003}
1004
1005/* See gdb_bfd.h. */
1006
1007int
1008gdb_bfd_count_sections (bfd *abfd)
1009{
1010 return bfd_count_sections (abfd) + 4;
1011}
1012
1da77581
TT
1013/* See gdb_bfd.h. */
1014
1015int
1016gdb_bfd_requires_relocations (bfd *abfd)
1017{
9a3c8263 1018 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1da77581
TT
1019
1020 if (gdata->relocation_computed == 0)
1021 {
1022 asection *sect;
1023
1024 for (sect = abfd->sections; sect != NULL; sect = sect->next)
1025 if ((sect->flags & SEC_RELOC) != 0)
1026 {
1027 gdata->needs_relocations = 1;
1028 break;
1029 }
1030
1031 gdata->relocation_computed = 1;
1032 }
1033
1034 return gdata->needs_relocations;
1035}
1036
e0fc5c3f
SM
1037/* See gdb_bfd.h. */
1038
1039bool
1040gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
1041 gdb::byte_vector *contents)
1042{
1043 bfd_size_type section_size = bfd_section_size (section);
1044
1045 contents->resize (section_size);
1046
1047 return bfd_get_section_contents (abfd, section, contents->data (), 0,
1048 section_size);
1049}
65cf3563 1050
d6b28940
TT
1051/* A callback for htab_traverse that prints a single BFD. */
1052
1053static int
1054print_one_bfd (void **slot, void *data)
1055{
9a3c8263
SM
1056 bfd *abfd = (struct bfd *) *slot;
1057 struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1058 struct ui_out *uiout = (struct ui_out *) data;
d6b28940 1059
2e783024 1060 ui_out_emit_tuple tuple_emitter (uiout, NULL);
381befee 1061 uiout->field_signed ("refcount", gdata->refc);
112e8700
SM
1062 uiout->field_string ("addr", host_address_to_string (abfd));
1063 uiout->field_string ("filename", bfd_get_filename (abfd));
1064 uiout->text ("\n");
d6b28940
TT
1065
1066 return 1;
1067}
1068
1069/* Implement the 'maint info bfd' command. */
1070
1071static void
e4e33335 1072maintenance_info_bfds (const char *arg, int from_tty)
d6b28940 1073{
d6b28940
TT
1074 struct ui_out *uiout = current_uiout;
1075
4a2b031d 1076 ui_out_emit_table table_emitter (uiout, 3, -1, "bfds");
112e8700
SM
1077 uiout->table_header (10, ui_left, "refcount", "Refcount");
1078 uiout->table_header (18, ui_left, "addr", "Address");
1079 uiout->table_header (40, ui_left, "filename", "Filename");
d6b28940 1080
112e8700 1081 uiout->table_body ();
d6b28940 1082 htab_traverse (all_bfds, print_one_bfd, uiout);
d6b28940
TT
1083}
1084
6c265988 1085void _initialize_gdb_bfd ();
d6b28940 1086void
6c265988 1087_initialize_gdb_bfd ()
d6b28940
TT
1088{
1089 all_bfds = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
1090 NULL, xcalloc, xfree);
1091
1092 add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
1093List the BFDs that are currently open."),
1094 &maintenanceinfolist);
18989b3c
AB
1095
1096 add_setshow_boolean_cmd ("bfd-sharing", no_class,
1097 &bfd_sharing, _("\
1098Set whether gdb will share bfds that appear to be the same file."), _("\
1099Show whether gdb will share bfds that appear to be the same file."), _("\
1100When enabled gdb will reuse existing bfds rather than reopening the\n\
1101same file. To decide if two files are the same then gdb compares the\n\
1102filename, file size, file modification time, and file inode."),
1103 NULL,
1104 &show_bfd_sharing,
1105 &maintenance_set_cmdlist,
1106 &maintenance_show_cmdlist);
566f5e3b
AB
1107
1108 add_setshow_zuinteger_cmd ("bfd-cache", class_maintenance,
1109 &debug_bfd_cache, _("\
1110Set bfd cache debugging."), _("\
1111Show bfd cache debugging."), _("\
1112When non-zero, bfd cache specific debugging is enabled."),
1113 NULL,
1114 &show_bfd_cache_debug,
1115 &setdebuglist, &showdebuglist);
d6b28940 1116}