xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/gdb_bfd.c (revision eceb233b9bd0dfebb902ed73b531ae6964fa3f9b)
1 /* Definitions for BFD wrappers used by GDB.
2 
3    Copyright (C) 2011-2019 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 "common/filestuff.h"
26 #include "common/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 /* An object of this type is stored in the section's user data when
38    mapping a section.  */
39 
40 struct 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 };
51 
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 
57 static htab_t all_bfds;
58 
59 /* An object of this type is stored in each BFD's user data.  */
60 
61 struct gdb_bfd_data
62 {
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   {
87   }
88 
89   /* The reference count.  */
90   int refc = 1;
91 
92   /* The mtime of the BFD at the point the cache entry was made.  */
93   time_t mtime;
94 
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 
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 
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.  */
115   unsigned long crc = 0;
116 
117   /* If the BFD comes from an archive, this points to the archive's
118      BFD.  Otherwise, this is NULL.  */
119   bfd *archive_bfd = nullptr;
120 
121   /* Table of all the bfds this bfd has included.  */
122   std::vector<gdb_bfd_ref_ptr> included_bfds;
123 
124   /* The registry.  */
125   REGISTRY_FIELDS = {};
126 };
127 
128 #define GDB_BFD_DATA_ACCESSOR(ABFD) \
129   ((struct gdb_bfd_data *) bfd_usrdata (ABFD))
130 
131 DEFINE_REGISTRY (bfd, GDB_BFD_DATA_ACCESSOR)
132 
133 /* A hash table storing all the BFDs maintained in the cache.  */
134 
135 static htab_t gdb_bfd_cache;
136 
137 /* When true gdb will reuse an existing bfd object if the filename,
138    modification time, and file size all match.  */
139 
140 static int bfd_sharing = 1;
141 static void
142 show_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 
148 /* When non-zero debugging of the bfd caches is enabled.  */
149 
150 static unsigned int debug_bfd_cache;
151 static void
152 show_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 
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 
162 struct gdb_bfd_cache_search
163 {
164   /* The filename.  */
165   const char *filename;
166   /* The mtime.  */
167   time_t mtime;
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;
174 };
175 
176 /* A hash function for BFDs.  */
177 
178 static hashval_t
179 hash_bfd (const void *b)
180 {
181   const bfd *abfd = (const struct bfd *) b;
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 
190 static int
191 eq_bfd (const void *a, const void *b)
192 {
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);
197 
198   return (gdata->mtime == s->mtime
199 	  && gdata->size == s->size
200 	  && gdata->inode == s->inode
201 	  && gdata->device_id == s->device_id
202 	  && strcmp (bfd_get_filename (abfd), s->filename) == 0);
203 }
204 
205 /* See gdb_bfd.h.  */
206 
207 int
208 is_target_filename (const char *name)
209 {
210   return startswith (name, TARGET_SYSROOT_PREFIX);
211 }
212 
213 /* See gdb_bfd.h.  */
214 
215 int
216 gdb_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 
224 static int
225 fileio_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 
279 static void *
280 gdb_bfd_iovec_fileio_open (struct bfd *abfd, void *inferior)
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 
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);
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 
308 static file_ptr
309 gdb_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     {
319       QUIT;
320 
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 
343 static int
344 gdb_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 
362 static int
363 gdb_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 
382 gdb_bfd_ref_ptr
383 gdb_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 
391   if (is_target_filename (name))
392     {
393       if (!target_filesystem_is_local ())
394 	{
395 	  gdb_assert (fd == -1);
396 
397 	  return gdb_bfd_openr_iovec (name, target,
398 				      gdb_bfd_iovec_fileio_open,
399 				      current_inferior (),
400 				      gdb_bfd_iovec_fileio_pread,
401 				      gdb_bfd_iovec_fileio_close,
402 				      gdb_bfd_iovec_fileio_fstat);
403 	}
404 
405       name += strlen (TARGET_SYSROOT_PREFIX);
406     }
407 
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     {
414       fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0);
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;
427       search.size = 0;
428       search.inode = 0;
429       search.device_id = 0;
430     }
431   else
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     }
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.  */
444   abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
445   if (bfd_sharing && abfd != NULL)
446     {
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));
452       close (fd);
453       return gdb_bfd_ref_ptr::new_reference (abfd);
454     }
455 
456   abfd = bfd_fopen (name, target, FOPEN_RB, fd);
457   if (abfd == NULL)
458     return NULL;
459 
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 
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     }
472 
473   return gdb_bfd_ref_ptr::new_reference (abfd);
474 }
475 
476 /* A helper function that releases any section data attached to the
477    BFD.  */
478 
479 static void
480 free_one_bfd_section (bfd *abfd, asection *sectp, void *ignore)
481 {
482   struct gdb_bfd_section_data *sect
483     = (struct gdb_bfd_section_data *) bfd_get_section_userdata (abfd, sectp);
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 
501 /* Close ABFD, and warn if that fails.  */
502 
503 static int
504 gdb_bfd_close_or_warn (struct bfd *abfd)
505 {
506   int ret;
507   char *name = bfd_get_filename (abfd);
508 
509   bfd_map_over_sections (abfd, free_one_bfd_section, NULL);
510 
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 
520 /* See gdb_bfd.h.  */
521 
522 void
523 gdb_bfd_ref (struct bfd *abfd)
524 {
525   struct gdb_bfd_data *gdata;
526   void **slot;
527 
528   if (abfd == NULL)
529     return;
530 
531   gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
532 
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 
539   if (gdata != NULL)
540     {
541       gdata->refc += 1;
542       return;
543     }
544 
545   /* Ask BFD to decompress sections in bfd_get_full_section_contents.  */
546   abfd->flags |= BFD_DECOMPRESS;
547 
548   gdata = new gdb_bfd_data (abfd);
549   bfd_usrdata (abfd) = gdata;
550   bfd_alloc_data (abfd);
551 
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;
556 }
557 
558 /* See gdb_bfd.h.  */
559 
560 void
561 gdb_bfd_unref (struct bfd *abfd)
562 {
563   struct gdb_bfd_data *gdata;
564   struct gdb_bfd_cache_search search;
565   bfd *archive_bfd;
566 
567   if (abfd == NULL)
568     return;
569 
570   gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
571   gdb_assert (gdata->refc >= 1);
572 
573   gdata->refc -= 1;
574   if (gdata->refc > 0)
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));
589 
590   archive_bfd = gdata->archive_bfd;
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;
599       search.size = gdata->size;
600       search.inode = gdata->inode;
601       search.device_id = gdata->device_id;
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 
609   bfd_free_data (abfd);
610   delete gdata;
611   bfd_usrdata (abfd) = NULL;  /* Paranoia.  */
612 
613   htab_remove_elt (all_bfds, abfd);
614 
615   gdb_bfd_close_or_warn (abfd);
616 
617   gdb_bfd_unref (archive_bfd);
618 }
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 
624 static struct gdb_bfd_section_data *
625 get_section_descriptor (asection *section)
626 {
627   struct gdb_bfd_section_data *result;
628 
629   result = ((struct gdb_bfd_section_data *)
630 	    bfd_get_section_userdata (section->owner, section));
631 
632   if (result == NULL)
633     {
634       result = ((struct gdb_bfd_section_data *)
635 		bfd_zalloc (section->owner, sizeof (*result)));
636       bfd_set_section_userdata (section->owner, section, result);
637     }
638 
639   return result;
640 }
641 
642 /* See gdb_bfd.h.  */
643 
644 const gdb_byte *
645 gdb_bfd_map_section (asection *sectp, bfd_size_type *size)
646 {
647   bfd *abfd;
648   struct gdb_bfd_section_data *descriptor;
649   bfd_byte *data;
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 
662 #ifdef HAVE_MMAP
663   if (!bfd_is_section_compressed (abfd, sectp))
664     {
665       /* The page size, used when mmapping.  */
666       static int pagesize;
667 
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 	    {
684 #if HAVE_POSIX_MADVISE
685 	      posix_madvise (descriptor->map_addr, descriptor->map_len,
686 			     POSIX_MADV_WILLNEED);
687 #endif
688 	      goto done;
689 	    }
690 
691 	  /* On failure, clear out the section data and try again.  */
692 	  memset (descriptor, 0, sizeof (*descriptor));
693 	}
694     }
695 #endif /* HAVE_MMAP */
696 
697   /* Handle compressed sections, or ordinary uncompressed sections in
698      the no-mmap case.  */
699 
700   descriptor->size = bfd_get_section_size (sectp);
701   descriptor->data = NULL;
702 
703   data = NULL;
704   if (!bfd_get_full_section_contents (abfd, sectp, &data))
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     }
714   descriptor->data = data;
715 
716  done:
717   gdb_assert (descriptor->data != NULL);
718   *size = descriptor->size;
719   return (const gdb_byte *) descriptor->data;
720 }
721 
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 
726 static int
727 get_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 
761 int
762 gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
763 {
764   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
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 
774 
775 
776 /* See gdb_bfd.h.  */
777 
778 gdb_bfd_ref_ptr
779 gdb_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 
784   return gdb_bfd_ref_ptr::new_reference (result);
785 }
786 
787 /* See gdb_bfd.h.  */
788 
789 gdb_bfd_ref_ptr
790 gdb_bfd_openr (const char *filename, const char *target)
791 {
792   bfd *result = bfd_openr (filename, target);
793 
794   return gdb_bfd_ref_ptr::new_reference (result);
795 }
796 
797 /* See gdb_bfd.h.  */
798 
799 gdb_bfd_ref_ptr
800 gdb_bfd_openw (const char *filename, const char *target)
801 {
802   bfd *result = bfd_openw (filename, target);
803 
804   return gdb_bfd_ref_ptr::new_reference (result);
805 }
806 
807 /* See gdb_bfd.h.  */
808 
809 gdb_bfd_ref_ptr
810 gdb_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 
829   return gdb_bfd_ref_ptr::new_reference (result);
830 }
831 
832 /* See gdb_bfd.h.  */
833 
834 void
835 gdb_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 
843   gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
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 
855 gdb_bfd_ref_ptr
856 gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
857 {
858   bfd *result = bfd_openr_next_archived_file (archive, previous);
859 
860   if (result)
861     gdb_bfd_mark_parent (result, archive);
862 
863   return gdb_bfd_ref_ptr (result);
864 }
865 
866 /* See gdb_bfd.h.  */
867 
868 void
869 gdb_bfd_record_inclusion (bfd *includer, bfd *includee)
870 {
871   struct gdb_bfd_data *gdata;
872 
873   gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
874   gdata->included_bfds.push_back (gdb_bfd_ref_ptr::new_reference (includee));
875 }
876 
877 /* See gdb_bfd.h.  */
878 
879 gdb_bfd_ref_ptr
880 gdb_bfd_fdopenr (const char *filename, const char *target, int fd)
881 {
882   bfd *result = bfd_fdopenr (filename, target, fd);
883 
884   return gdb_bfd_ref_ptr::new_reference (result);
885 }
886 
887 
888 
889 gdb_static_assert (ARRAY_SIZE (_bfd_std_section) == 4);
890 
891 /* See gdb_bfd.h.  */
892 
893 int
894 gdb_bfd_section_index (bfd *abfd, asection *section)
895 {
896   if (section == NULL)
897     return -1;
898   else if (section == bfd_com_section_ptr)
899     return bfd_count_sections (abfd);
900   else if (section == bfd_und_section_ptr)
901     return bfd_count_sections (abfd) + 1;
902   else if (section == bfd_abs_section_ptr)
903     return bfd_count_sections (abfd) + 2;
904   else if (section == bfd_ind_section_ptr)
905     return bfd_count_sections (abfd) + 3;
906   return section->index;
907 }
908 
909 /* See gdb_bfd.h.  */
910 
911 int
912 gdb_bfd_count_sections (bfd *abfd)
913 {
914   return bfd_count_sections (abfd) + 4;
915 }
916 
917 /* See gdb_bfd.h.  */
918 
919 int
920 gdb_bfd_requires_relocations (bfd *abfd)
921 {
922   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
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 
941 
942 
943 /* A callback for htab_traverse that prints a single BFD.  */
944 
945 static int
946 print_one_bfd (void **slot, void *data)
947 {
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;
951 
952   ui_out_emit_tuple tuple_emitter (uiout, NULL);
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");
957 
958   return 1;
959 }
960 
961 /* Implement the 'maint info bfd' command.  */
962 
963 static void
964 maintenance_info_bfds (const char *arg, int from_tty)
965 {
966   struct ui_out *uiout = current_uiout;
967 
968   ui_out_emit_table table_emitter (uiout, 3, -1, "bfds");
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");
972 
973   uiout->table_body ();
974   htab_traverse (all_bfds, print_one_bfd, uiout);
975 }
976 
977 void
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, _("\
984 List the BFDs that are currently open."),
985 	   &maintenanceinfolist);
986 
987   add_setshow_boolean_cmd ("bfd-sharing", no_class,
988 			   &bfd_sharing, _("\
989 Set whether gdb will share bfds that appear to be the same file."), _("\
990 Show whether gdb will share bfds that appear to be the same file."), _("\
991 When enabled gdb will reuse existing bfds rather than reopening the\n\
992 same file.  To decide if two files are the same then gdb compares the\n\
993 filename, file size, file modification time, and file inode."),
994 			   NULL,
995 			   &show_bfd_sharing,
996 			   &maintenance_set_cmdlist,
997 			   &maintenance_show_cmdlist);
998 
999   add_setshow_zuinteger_cmd ("bfd-cache", class_maintenance,
1000 			     &debug_bfd_cache, _("\
1001 Set bfd cache debugging."), _("\
1002 Show bfd cache debugging."), _("\
1003 When non-zero, bfd cache specific debugging is enabled."),
1004 			     NULL,
1005 			     &show_bfd_cache_debug,
1006 			     &setdebuglist, &showdebuglist);
1007 }
1008