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