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