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