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