xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/gdb_bfd.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Definitions for BFD wrappers used by GDB.
2 
3    Copyright (C) 2011-2023 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 "gdbsupport/filestuff.h"
26 #ifdef HAVE_MMAP
27 #include <sys/mman.h>
28 #ifndef MAP_FAILED
29 #define MAP_FAILED ((void *) -1)
30 #endif
31 #endif
32 #include "target.h"
33 #include "gdbsupport/fileio.h"
34 #include "inferior.h"
35 #include "cli/cli-style.h"
36 #include <unordered_map>
37 
38 /* An object of this type is stored in the section's user data when
39    mapping a section.  */
40 
41 struct gdb_bfd_section_data
42 {
43   /* Size of the data.  */
44   bfd_size_type size;
45   /* If the data was mmapped, this is the length of the map.  */
46   bfd_size_type map_len;
47   /* The data.  If NULL, the section data has not been read.  */
48   void *data;
49   /* If the data was mmapped, this is the map address.  */
50   void *map_addr;
51 };
52 
53 /* A hash table holding every BFD that gdb knows about.  This is not
54    to be confused with 'gdb_bfd_cache', which is used for sharing
55    BFDs; in contrast, this hash is used just to implement
56    "maint info bfd".  */
57 
58 static htab_t all_bfds;
59 
60 /* An object of this type is stored in each BFD's user data.  */
61 
62 struct gdb_bfd_data
63 {
64   /* Note that if ST is nullptr, then we simply fill in zeroes.  */
65   gdb_bfd_data (bfd *abfd, struct stat *st)
66     : mtime (st == nullptr ? 0 : st->st_mtime),
67       size (st == nullptr ? 0 : st->st_size),
68       inode (st == nullptr ? 0 : st->st_ino),
69       device_id (st == nullptr ? 0 : st->st_dev),
70       relocation_computed (0),
71       needs_relocations (0),
72       crc_computed (0)
73   {
74   }
75 
76   ~gdb_bfd_data ()
77   {
78   }
79 
80   /* The reference count.  */
81   int refc = 1;
82 
83   /* The mtime of the BFD at the point the cache entry was made.  */
84   time_t mtime;
85 
86   /* The file size (in bytes) at the point the cache entry was made.  */
87   off_t size;
88 
89   /* The inode of the file at the point the cache entry was made.  */
90   ino_t inode;
91 
92   /* The device id of the file at the point the cache entry was made.  */
93   dev_t device_id;
94 
95   /* This is true if we have determined whether this BFD has any
96      sections requiring relocation.  */
97   unsigned int relocation_computed : 1;
98 
99   /* This is true if any section needs relocation.  */
100   unsigned int needs_relocations : 1;
101 
102   /* This is true if we have successfully computed the file's CRC.  */
103   unsigned int crc_computed : 1;
104 
105   /* The file's CRC.  */
106   unsigned long crc = 0;
107 
108   /* If the BFD comes from an archive, this points to the archive's
109      BFD.  Otherwise, this is NULL.  */
110   bfd *archive_bfd = nullptr;
111 
112   /* Table of all the bfds this bfd has included.  */
113   std::vector<gdb_bfd_ref_ptr> included_bfds;
114 
115   /* The registry.  */
116   registry<bfd> registry_fields;
117 };
118 
119 registry<bfd> *
120 registry_accessor<bfd>::get (bfd *abfd)
121 {
122   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
123   return &gdata->registry_fields;
124 }
125 
126 /* A hash table storing all the BFDs maintained in the cache.  */
127 
128 static htab_t gdb_bfd_cache;
129 
130 /* When true gdb will reuse an existing bfd object if the filename,
131    modification time, and file size all match.  */
132 
133 static bool bfd_sharing = true;
134 static void
135 show_bfd_sharing  (struct ui_file *file, int from_tty,
136 		   struct cmd_list_element *c, const char *value)
137 {
138   gdb_printf (file, _("BFD sharing is %s.\n"), value);
139 }
140 
141 /* When true debugging of the bfd caches is enabled.  */
142 
143 static bool debug_bfd_cache;
144 
145 /* Print an "bfd-cache" debug statement.  */
146 
147 #define bfd_cache_debug_printf(fmt, ...) \
148   debug_prefixed_printf_cond (debug_bfd_cache, "bfd-cache", fmt, ##__VA_ARGS__)
149 
150 static void
151 show_bfd_cache_debug (struct ui_file *file, int from_tty,
152 		      struct cmd_list_element *c, const char *value)
153 {
154   gdb_printf (file, _("BFD cache debugging is %s.\n"), value);
155 }
156 
157 /* The type of an object being looked up in gdb_bfd_cache.  We use
158    htab's capability of storing one kind of object (BFD in this case)
159    and using a different sort of object for searching.  */
160 
161 struct gdb_bfd_cache_search
162 {
163   /* The filename.  */
164   const char *filename;
165   /* The mtime.  */
166   time_t mtime;
167   /* The file size (in bytes).  */
168   off_t size;
169   /* The inode of the file.  */
170   ino_t inode;
171   /* The device id of the file.  */
172   dev_t device_id;
173 };
174 
175 /* A hash function for BFDs.  */
176 
177 static hashval_t
178 hash_bfd (const void *b)
179 {
180   const bfd *abfd = (const struct bfd *) b;
181 
182   /* It is simplest to just hash the filename.  */
183   return htab_hash_string (bfd_get_filename (abfd));
184 }
185 
186 /* An equality function for BFDs.  Note that this expects the caller
187    to search using struct gdb_bfd_cache_search only, not BFDs.  */
188 
189 static int
190 eq_bfd (const void *a, const void *b)
191 {
192   const bfd *abfd = (const struct bfd *) a;
193   const struct gdb_bfd_cache_search *s
194     = (const struct gdb_bfd_cache_search *) b;
195   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
196 
197   return (gdata->mtime == s->mtime
198 	  && gdata->size == s->size
199 	  && gdata->inode == s->inode
200 	  && gdata->device_id == s->device_id
201 	  && strcmp (bfd_get_filename (abfd), s->filename) == 0);
202 }
203 
204 /* See gdb_bfd.h.  */
205 
206 int
207 is_target_filename (const char *name)
208 {
209   return startswith (name, TARGET_SYSROOT_PREFIX);
210 }
211 
212 /* See gdb_bfd.h.  */
213 
214 int
215 gdb_bfd_has_target_filename (struct bfd *abfd)
216 {
217   return is_target_filename (bfd_get_filename (abfd));
218 }
219 
220 /* For `gdb_bfd_open_from_target_memory`.  An object that manages the
221    details of a BFD in target memory.  */
222 
223 struct target_buffer
224 {
225   /* Constructor.  BASE and SIZE define where the BFD can be found in
226      target memory.  */
227   target_buffer (CORE_ADDR base, ULONGEST size)
228     : m_base (base),
229       m_size (size)
230   {
231     m_filename
232       = xstrprintf ("<in-memory@%s>", core_addr_to_string_nz (m_base));
233   }
234 
235   /* Return the size of the in-memory BFD file.  */
236   ULONGEST size () const
237   { return m_size; }
238 
239   /* Return the base address of the in-memory BFD file.  */
240   CORE_ADDR base () const
241   { return m_base; }
242 
243   /* Return a generated filename for the in-memory BFD file.  The generated
244      name will include the M_BASE value.  */
245   const char *filename () const
246   { return m_filename.get (); }
247 
248 private:
249   /* The base address of the in-memory BFD file.  */
250   CORE_ADDR m_base;
251 
252   /* The size (in-bytes) of the in-memory BFD file.  */
253   ULONGEST m_size;
254 
255   /* Holds the generated name of the in-memory BFD file.  */
256   gdb::unique_xmalloc_ptr<char> m_filename;
257 };
258 
259 /* For `gdb_bfd_open_from_target_memory`.  Opening the file is a no-op.  */
260 
261 static void *
262 mem_bfd_iovec_open (struct bfd *abfd, void *open_closure)
263 {
264   return open_closure;
265 }
266 
267 /* For `gdb_bfd_open_from_target_memory`.  Closing the file is just freeing the
268    base/size pair on our side.  */
269 
270 static int
271 mem_bfd_iovec_close (struct bfd *abfd, void *stream)
272 {
273   struct target_buffer *buffer = (target_buffer *) stream;
274   delete buffer;
275 
276   /* Zero means success.  */
277   return 0;
278 }
279 
280 /* For `gdb_bfd_open_from_target_memory`.  For reading the file, we just need to
281    pass through to target_read_memory and fix up the arguments and return
282    values.  */
283 
284 static file_ptr
285 mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
286 		     file_ptr nbytes, file_ptr offset)
287 {
288   struct target_buffer *buffer = (struct target_buffer *) stream;
289 
290   /* If this read will read all of the file, limit it to just the rest.  */
291   if (offset + nbytes > buffer->size ())
292     nbytes = buffer->size () - offset;
293 
294   /* If there are no more bytes left, we've reached EOF.  */
295   if (nbytes == 0)
296     return 0;
297 
298   int err
299     = target_read_memory (buffer->base () + offset, (gdb_byte *) buf, nbytes);
300   if (err)
301     return -1;
302 
303   return nbytes;
304 }
305 
306 /* For `gdb_bfd_open_from_target_memory`.  For statting the file, we only
307    support the st_size attribute.  */
308 
309 static int
310 mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
311 {
312   struct target_buffer *buffer = (struct target_buffer*) stream;
313 
314   memset (sb, 0, sizeof (struct stat));
315   sb->st_size = buffer->size ();
316   return 0;
317 }
318 
319 /* See gdb_bfd.h.  */
320 
321 gdb_bfd_ref_ptr
322 gdb_bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
323 				 const char *target)
324 {
325   struct target_buffer *buffer = new target_buffer (addr, size);
326 
327   return gdb_bfd_openr_iovec (buffer->filename (), target,
328 			      mem_bfd_iovec_open,
329 			      buffer,
330 			      mem_bfd_iovec_pread,
331 			      mem_bfd_iovec_close,
332 			      mem_bfd_iovec_stat);
333 }
334 
335 /* bfd_openr_iovec OPEN_CLOSURE data for gdb_bfd_open.  */
336 struct gdb_bfd_open_closure
337 {
338   inferior *inf;
339   bool warn_if_slow;
340 };
341 
342 /* Wrapper for target_fileio_open suitable for passing as the
343    OPEN_FUNC argument to gdb_bfd_openr_iovec.  */
344 
345 static void *
346 gdb_bfd_iovec_fileio_open (struct bfd *abfd, void *open_closure)
347 {
348   const char *filename = bfd_get_filename (abfd);
349   int fd;
350   fileio_error target_errno;
351   int *stream;
352   gdb_bfd_open_closure *oclosure = (gdb_bfd_open_closure *) open_closure;
353 
354   gdb_assert (is_target_filename (filename));
355 
356   fd = target_fileio_open (oclosure->inf,
357 			   filename + strlen (TARGET_SYSROOT_PREFIX),
358 			   FILEIO_O_RDONLY, 0, oclosure->warn_if_slow,
359 			   &target_errno);
360   if (fd == -1)
361     {
362       errno = fileio_error_to_host (target_errno);
363       bfd_set_error (bfd_error_system_call);
364       return NULL;
365     }
366 
367   stream = XCNEW (int);
368   *stream = fd;
369   return stream;
370 }
371 
372 /* Wrapper for target_fileio_pread suitable for passing as the
373    PREAD_FUNC argument to gdb_bfd_openr_iovec.  */
374 
375 static file_ptr
376 gdb_bfd_iovec_fileio_pread (struct bfd *abfd, void *stream, void *buf,
377 			    file_ptr nbytes, file_ptr offset)
378 {
379   int fd = *(int *) stream;
380   fileio_error target_errno;
381   file_ptr pos, bytes;
382 
383   pos = 0;
384   while (nbytes > pos)
385     {
386       QUIT;
387 
388       bytes = target_fileio_pread (fd, (gdb_byte *) buf + pos,
389 				   nbytes - pos, offset + pos,
390 				   &target_errno);
391       if (bytes == 0)
392 	/* Success, but no bytes, means end-of-file.  */
393 	break;
394       if (bytes == -1)
395 	{
396 	  errno = fileio_error_to_host (target_errno);
397 	  bfd_set_error (bfd_error_system_call);
398 	  return -1;
399 	}
400 
401       pos += bytes;
402     }
403 
404   return pos;
405 }
406 
407 /* Warn that it wasn't possible to close a bfd for file NAME, because
408    of REASON.  */
409 
410 static void
411 gdb_bfd_close_warning (const char *name, const char *reason)
412 {
413   warning (_("cannot close \"%s\": %s"), name, reason);
414 }
415 
416 /* Wrapper for target_fileio_close suitable for passing as the
417    CLOSE_FUNC argument to gdb_bfd_openr_iovec.  */
418 
419 static int
420 gdb_bfd_iovec_fileio_close (struct bfd *abfd, void *stream)
421 {
422   int fd = *(int *) stream;
423   fileio_error target_errno;
424 
425   xfree (stream);
426 
427   /* Ignore errors on close.  These may happen with remote
428      targets if the connection has already been torn down.  */
429   try
430     {
431       target_fileio_close (fd, &target_errno);
432     }
433   catch (const gdb_exception &ex)
434     {
435       /* Also avoid crossing exceptions over bfd.  */
436       gdb_bfd_close_warning (bfd_get_filename (abfd),
437 			     ex.message->c_str ());
438     }
439 
440   /* Zero means success.  */
441   return 0;
442 }
443 
444 /* Wrapper for target_fileio_fstat suitable for passing as the
445    STAT_FUNC argument to gdb_bfd_openr_iovec.  */
446 
447 static int
448 gdb_bfd_iovec_fileio_fstat (struct bfd *abfd, void *stream,
449 			    struct stat *sb)
450 {
451   int fd = *(int *) stream;
452   fileio_error target_errno;
453   int result;
454 
455   result = target_fileio_fstat (fd, sb, &target_errno);
456   if (result == -1)
457     {
458       errno = fileio_error_to_host (target_errno);
459       bfd_set_error (bfd_error_system_call);
460     }
461 
462   return result;
463 }
464 
465 /* A helper function to initialize the data that gdb attaches to each
466    BFD.  */
467 
468 static void
469 gdb_bfd_init_data (struct bfd *abfd, struct stat *st)
470 {
471   struct gdb_bfd_data *gdata;
472   void **slot;
473 
474   gdb_assert (bfd_usrdata (abfd) == nullptr);
475 
476   /* Ask BFD to decompress sections in bfd_get_full_section_contents.  */
477   abfd->flags |= BFD_DECOMPRESS;
478 
479   gdata = new gdb_bfd_data (abfd, st);
480   bfd_set_usrdata (abfd, gdata);
481 
482   /* This is the first we've seen it, so add it to the hash table.  */
483   slot = htab_find_slot (all_bfds, abfd, INSERT);
484   gdb_assert (slot && !*slot);
485   *slot = abfd;
486 }
487 
488 /* See gdb_bfd.h.  */
489 
490 gdb_bfd_ref_ptr
491 gdb_bfd_open (const char *name, const char *target, int fd,
492 	      bool warn_if_slow)
493 {
494   hashval_t hash;
495   void **slot;
496   bfd *abfd;
497   struct gdb_bfd_cache_search search;
498   struct stat st;
499 
500   if (is_target_filename (name))
501     {
502       if (!target_filesystem_is_local ())
503 	{
504 	  gdb_assert (fd == -1);
505 
506 	  gdb_bfd_open_closure open_closure { current_inferior (), warn_if_slow };
507 	  return gdb_bfd_openr_iovec (name, target,
508 				      gdb_bfd_iovec_fileio_open,
509 				      &open_closure,
510 				      gdb_bfd_iovec_fileio_pread,
511 				      gdb_bfd_iovec_fileio_close,
512 				      gdb_bfd_iovec_fileio_fstat);
513 	}
514 
515       name += strlen (TARGET_SYSROOT_PREFIX);
516     }
517 
518   if (gdb_bfd_cache == NULL)
519     gdb_bfd_cache = htab_create_alloc (1, hash_bfd, eq_bfd, NULL,
520 				       xcalloc, xfree);
521 
522   if (fd == -1)
523     {
524       fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0).release ();
525       if (fd == -1)
526 	{
527 	  bfd_set_error (bfd_error_system_call);
528 	  return NULL;
529 	}
530     }
531 
532   if (fstat (fd, &st) < 0)
533     {
534       /* Weird situation here -- don't cache if we can't stat.  */
535       bfd_cache_debug_printf ("Could not stat %s - not caching", name);
536       abfd = bfd_fopen (name, target, FOPEN_RB, fd);
537       if (abfd == nullptr)
538 	return nullptr;
539       return gdb_bfd_ref_ptr::new_reference (abfd);
540     }
541 
542   search.filename = name;
543   search.mtime = st.st_mtime;
544   search.size = st.st_size;
545   search.inode = st.st_ino;
546   search.device_id = st.st_dev;
547 
548   /* Note that this must compute the same result as hash_bfd.  */
549   hash = htab_hash_string (name);
550   /* Note that we cannot use htab_find_slot_with_hash here, because
551      opening the BFD may fail; and this would violate hashtab
552      invariants.  */
553   abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
554   if (bfd_sharing && abfd != NULL)
555     {
556       bfd_cache_debug_printf ("Reusing cached bfd %s for %s",
557 			      host_address_to_string (abfd),
558 			      bfd_get_filename (abfd));
559       close (fd);
560       return gdb_bfd_ref_ptr::new_reference (abfd);
561     }
562 
563   abfd = bfd_fopen (name, target, FOPEN_RB, fd);
564   if (abfd == NULL)
565     return NULL;
566 
567   bfd_cache_debug_printf ("Creating new bfd %s for %s",
568 			  host_address_to_string (abfd),
569 			  bfd_get_filename (abfd));
570 
571   if (bfd_sharing)
572     {
573       slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
574       gdb_assert (!*slot);
575       *slot = abfd;
576     }
577 
578   /* It's important to pass the already-computed stat info here,
579      rather than, say, calling gdb_bfd_ref_ptr::new_reference.  BFD by
580      default will "stat" the file each time bfd_get_mtime is called --
581      and since we already entered it into the hash table using this
582      mtime, if the file changed at the wrong moment, the race would
583      lead to a hash table corruption.  */
584   gdb_bfd_init_data (abfd, &st);
585   return gdb_bfd_ref_ptr (abfd);
586 }
587 
588 /* A helper function that releases any section data attached to the
589    BFD.  */
590 
591 static void
592 free_one_bfd_section (asection *sectp)
593 {
594   struct gdb_bfd_section_data *sect
595     = (struct gdb_bfd_section_data *) bfd_section_userdata (sectp);
596 
597   if (sect != NULL && sect->data != NULL)
598     {
599 #ifdef HAVE_MMAP
600       if (sect->map_addr != NULL)
601 	{
602 	  int res;
603 
604 	  res = munmap (sect->map_addr, sect->map_len);
605 	  gdb_assert (res == 0);
606 	}
607       else
608 #endif
609 	xfree (sect->data);
610     }
611 }
612 
613 /* Close ABFD, and warn if that fails.  */
614 
615 static int
616 gdb_bfd_close_or_warn (struct bfd *abfd)
617 {
618   int ret;
619   const char *name = bfd_get_filename (abfd);
620 
621   for (asection *sect : gdb_bfd_sections (abfd))
622     free_one_bfd_section (sect);
623 
624   ret = bfd_close (abfd);
625 
626   if (!ret)
627     gdb_bfd_close_warning (name,
628 			   bfd_errmsg (bfd_get_error ()));
629 
630   return ret;
631 }
632 
633 /* See gdb_bfd.h.  */
634 
635 void
636 gdb_bfd_ref (struct bfd *abfd)
637 {
638   struct gdb_bfd_data *gdata;
639 
640   if (abfd == NULL)
641     return;
642 
643   gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
644 
645   bfd_cache_debug_printf ("Increase reference count on bfd %s (%s)",
646 			  host_address_to_string (abfd),
647 			  bfd_get_filename (abfd));
648 
649   if (gdata != NULL)
650     {
651       gdata->refc += 1;
652       return;
653     }
654 
655   /* Caching only happens via gdb_bfd_open, so passing nullptr here is
656      fine.  */
657   gdb_bfd_init_data (abfd, nullptr);
658 }
659 
660 /* See gdb_bfd.h.  */
661 
662 void
663 gdb_bfd_unref (struct bfd *abfd)
664 {
665   struct gdb_bfd_data *gdata;
666   struct gdb_bfd_cache_search search;
667   bfd *archive_bfd;
668 
669   if (abfd == NULL)
670     return;
671 
672   gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
673   gdb_assert (gdata->refc >= 1);
674 
675   gdata->refc -= 1;
676   if (gdata->refc > 0)
677     {
678       bfd_cache_debug_printf ("Decrease reference count on bfd %s (%s)",
679 			      host_address_to_string (abfd),
680 			      bfd_get_filename (abfd));
681       return;
682     }
683 
684   bfd_cache_debug_printf ("Delete final reference count on bfd %s (%s)",
685 			  host_address_to_string (abfd),
686 			  bfd_get_filename (abfd));
687 
688   archive_bfd = gdata->archive_bfd;
689   search.filename = bfd_get_filename (abfd);
690 
691   if (gdb_bfd_cache && search.filename)
692     {
693       hashval_t hash = htab_hash_string (search.filename);
694       void **slot;
695 
696       search.mtime = gdata->mtime;
697       search.size = gdata->size;
698       search.inode = gdata->inode;
699       search.device_id = gdata->device_id;
700       slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash,
701 				       NO_INSERT);
702 
703       if (slot && *slot)
704 	htab_clear_slot (gdb_bfd_cache, slot);
705     }
706 
707   delete gdata;
708   bfd_set_usrdata (abfd, NULL);  /* Paranoia.  */
709 
710   htab_remove_elt (all_bfds, abfd);
711 
712   gdb_bfd_close_or_warn (abfd);
713 
714   gdb_bfd_unref (archive_bfd);
715 }
716 
717 /* A helper function that returns the section data descriptor
718    associated with SECTION.  If no such descriptor exists, a new one
719    is allocated and cleared.  */
720 
721 static struct gdb_bfd_section_data *
722 get_section_descriptor (asection *section)
723 {
724   struct gdb_bfd_section_data *result;
725 
726   result = (struct gdb_bfd_section_data *) bfd_section_userdata (section);
727 
728   if (result == NULL)
729     {
730       result = ((struct gdb_bfd_section_data *)
731 		bfd_zalloc (section->owner, sizeof (*result)));
732       bfd_set_section_userdata (section, result);
733     }
734 
735   return result;
736 }
737 
738 /* See gdb_bfd.h.  */
739 
740 const gdb_byte *
741 gdb_bfd_map_section (asection *sectp, bfd_size_type *size)
742 {
743   bfd *abfd;
744   struct gdb_bfd_section_data *descriptor;
745   bfd_byte *data;
746 
747   gdb_assert ((sectp->flags & SEC_RELOC) == 0);
748   gdb_assert (size != NULL);
749 
750   abfd = sectp->owner;
751 
752   descriptor = get_section_descriptor (sectp);
753 
754   /* If the data was already read for this BFD, just reuse it.  */
755   if (descriptor->data != NULL)
756     goto done;
757 
758 #ifdef HAVE_MMAP
759   if (!bfd_is_section_compressed (abfd, sectp))
760     {
761       /* The page size, used when mmapping.  */
762       static int pagesize;
763 
764       if (pagesize == 0)
765 	pagesize = getpagesize ();
766 
767       /* Only try to mmap sections which are large enough: we don't want
768 	 to waste space due to fragmentation.  */
769 
770       if (bfd_section_size (sectp) > 4 * pagesize)
771 	{
772 	  descriptor->size = bfd_section_size (sectp);
773 	  descriptor->data = bfd_mmap (abfd, 0, descriptor->size, PROT_READ,
774 				       MAP_PRIVATE, sectp->filepos,
775 				       &descriptor->map_addr,
776 				       &descriptor->map_len);
777 
778 	  if ((caddr_t)descriptor->data != MAP_FAILED)
779 	    {
780 #if HAVE_POSIX_MADVISE
781 	      posix_madvise (descriptor->map_addr, descriptor->map_len,
782 			     POSIX_MADV_WILLNEED);
783 #endif
784 	      goto done;
785 	    }
786 
787 	  /* On failure, clear out the section data and try again.  */
788 	  memset (descriptor, 0, sizeof (*descriptor));
789 	}
790     }
791 #endif /* HAVE_MMAP */
792 
793   /* Handle compressed sections, or ordinary uncompressed sections in
794      the no-mmap case.  */
795 
796   descriptor->size = bfd_section_size (sectp);
797   descriptor->data = NULL;
798 
799   data = NULL;
800   if (!bfd_get_full_section_contents (abfd, sectp, &data))
801     {
802       warning (_("Can't read data for section '%s' in file '%s'"),
803 	       bfd_section_name (sectp),
804 	       bfd_get_filename (abfd));
805       /* Set size to 0 to prevent further attempts to read the invalid
806 	 section.  */
807       *size = 0;
808       return NULL;
809     }
810   descriptor->data = data;
811 
812  done:
813   gdb_assert (descriptor->data != NULL);
814   *size = descriptor->size;
815   return (const gdb_byte *) descriptor->data;
816 }
817 
818 /* Return 32-bit CRC for ABFD.  If successful store it to *FILE_CRC_RETURN and
819    return 1.  Otherwise print a warning and return 0.  ABFD seek position is
820    not preserved.  */
821 
822 static int
823 get_file_crc (bfd *abfd, unsigned long *file_crc_return)
824 {
825   unsigned long file_crc = 0;
826 
827   if (bfd_seek (abfd, 0, SEEK_SET) != 0)
828     {
829       warning (_("Problem reading \"%s\" for CRC: %s"),
830 	       bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
831       return 0;
832     }
833 
834   for (;;)
835     {
836       gdb_byte buffer[8 * 1024];
837       bfd_size_type count;
838 
839       count = bfd_bread (buffer, sizeof (buffer), abfd);
840       if (count == (bfd_size_type) -1)
841 	{
842 	  warning (_("Problem reading \"%s\" for CRC: %s"),
843 		   bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
844 	  return 0;
845 	}
846       if (count == 0)
847 	break;
848       file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
849     }
850 
851   *file_crc_return = file_crc;
852   return 1;
853 }
854 
855 /* See gdb_bfd.h.  */
856 
857 int
858 gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
859 {
860   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
861 
862   if (!gdata->crc_computed)
863     gdata->crc_computed = get_file_crc (abfd, &gdata->crc);
864 
865   if (gdata->crc_computed)
866     *crc_out = gdata->crc;
867   return gdata->crc_computed;
868 }
869 
870 
871 
872 /* See gdb_bfd.h.  */
873 
874 gdb_bfd_ref_ptr
875 gdb_bfd_fopen (const char *filename, const char *target, const char *mode,
876 	       int fd)
877 {
878   bfd *result = bfd_fopen (filename, target, mode, fd);
879 
880   return gdb_bfd_ref_ptr::new_reference (result);
881 }
882 
883 /* See gdb_bfd.h.  */
884 
885 gdb_bfd_ref_ptr
886 gdb_bfd_openr (const char *filename, const char *target)
887 {
888   bfd *result = bfd_openr (filename, target);
889 
890   return gdb_bfd_ref_ptr::new_reference (result);
891 }
892 
893 /* See gdb_bfd.h.  */
894 
895 gdb_bfd_ref_ptr
896 gdb_bfd_openw (const char *filename, const char *target)
897 {
898   bfd *result = bfd_openw (filename, target);
899 
900   return gdb_bfd_ref_ptr::new_reference (result);
901 }
902 
903 /* See gdb_bfd.h.  */
904 
905 gdb_bfd_ref_ptr
906 gdb_bfd_openr_iovec (const char *filename, const char *target,
907 		     void *(*open_func) (struct bfd *nbfd,
908 					 void *open_closure),
909 		     void *open_closure,
910 		     file_ptr (*pread_func) (struct bfd *nbfd,
911 					     void *stream,
912 					     void *buf,
913 					     file_ptr nbytes,
914 					     file_ptr offset),
915 		     int (*close_func) (struct bfd *nbfd,
916 					void *stream),
917 		     int (*stat_func) (struct bfd *abfd,
918 				       void *stream,
919 				       struct stat *sb))
920 {
921   bfd *result = bfd_openr_iovec (filename, target,
922 				 open_func, open_closure,
923 				 pread_func, close_func, stat_func);
924 
925   return gdb_bfd_ref_ptr::new_reference (result);
926 }
927 
928 /* See gdb_bfd.h.  */
929 
930 void
931 gdb_bfd_mark_parent (bfd *child, bfd *parent)
932 {
933   struct gdb_bfd_data *gdata;
934 
935   gdb_bfd_ref (child);
936   /* No need to stash the filename here, because we also keep a
937      reference on the parent archive.  */
938 
939   gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
940   if (gdata->archive_bfd == NULL)
941     {
942       gdata->archive_bfd = parent;
943       gdb_bfd_ref (parent);
944     }
945   else
946     gdb_assert (gdata->archive_bfd == parent);
947 }
948 
949 /* See gdb_bfd.h.  */
950 
951 gdb_bfd_ref_ptr
952 gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
953 {
954   bfd *result = bfd_openr_next_archived_file (archive, previous);
955 
956   if (result)
957     gdb_bfd_mark_parent (result, archive);
958 
959   return gdb_bfd_ref_ptr (result);
960 }
961 
962 /* See gdb_bfd.h.  */
963 
964 void
965 gdb_bfd_record_inclusion (bfd *includer, bfd *includee)
966 {
967   struct gdb_bfd_data *gdata;
968 
969   gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
970   gdata->included_bfds.push_back (gdb_bfd_ref_ptr::new_reference (includee));
971 }
972 
973 
974 
975 gdb_static_assert (ARRAY_SIZE (_bfd_std_section) == 4);
976 
977 /* See gdb_bfd.h.  */
978 
979 int
980 gdb_bfd_section_index (bfd *abfd, asection *section)
981 {
982   if (section == NULL)
983     return -1;
984   else if (section == bfd_com_section_ptr)
985     return bfd_count_sections (abfd);
986   else if (section == bfd_und_section_ptr)
987     return bfd_count_sections (abfd) + 1;
988   else if (section == bfd_abs_section_ptr)
989     return bfd_count_sections (abfd) + 2;
990   else if (section == bfd_ind_section_ptr)
991     return bfd_count_sections (abfd) + 3;
992   return section->index;
993 }
994 
995 /* See gdb_bfd.h.  */
996 
997 int
998 gdb_bfd_count_sections (bfd *abfd)
999 {
1000   return bfd_count_sections (abfd) + 4;
1001 }
1002 
1003 /* See gdb_bfd.h.  */
1004 
1005 int
1006 gdb_bfd_requires_relocations (bfd *abfd)
1007 {
1008   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1009 
1010   if (gdata->relocation_computed == 0)
1011     {
1012       asection *sect;
1013 
1014       for (sect = abfd->sections; sect != NULL; sect = sect->next)
1015 	if ((sect->flags & SEC_RELOC) != 0)
1016 	  {
1017 	    gdata->needs_relocations = 1;
1018 	    break;
1019 	  }
1020 
1021       gdata->relocation_computed = 1;
1022     }
1023 
1024   return gdata->needs_relocations;
1025 }
1026 
1027 /* See gdb_bfd.h.  */
1028 
1029 bool
1030 gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
1031 				   gdb::byte_vector *contents)
1032 {
1033   bfd_size_type section_size = bfd_section_size (section);
1034 
1035   contents->resize (section_size);
1036 
1037   return bfd_get_section_contents (abfd, section, contents->data (), 0,
1038 				   section_size);
1039 }
1040 
1041 #define AMBIGUOUS_MESS1	".\nMatching formats:"
1042 #define AMBIGUOUS_MESS2	\
1043   ".\nUse \"set gnutarget format-name\" to specify the format."
1044 
1045 /* See gdb_bfd.h.  */
1046 
1047 std::string
1048 gdb_bfd_errmsg (bfd_error_type error_tag, char **matching)
1049 {
1050   char **p;
1051 
1052   /* Check if errmsg just need simple return.  */
1053   if (error_tag != bfd_error_file_ambiguously_recognized || matching == NULL)
1054     return bfd_errmsg (error_tag);
1055 
1056   std::string ret (bfd_errmsg (error_tag));
1057   ret += AMBIGUOUS_MESS1;
1058 
1059   for (p = matching; *p; p++)
1060     {
1061       ret += " ";
1062       ret += *p;
1063     }
1064   ret += AMBIGUOUS_MESS2;
1065 
1066   xfree (matching);
1067 
1068   return ret;
1069 }
1070 
1071 /* A callback for htab_traverse that prints a single BFD.  */
1072 
1073 static int
1074 print_one_bfd (void **slot, void *data)
1075 {
1076   bfd *abfd = (struct bfd *) *slot;
1077   struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
1078   struct ui_out *uiout = (struct ui_out *) data;
1079 
1080   ui_out_emit_tuple tuple_emitter (uiout, NULL);
1081   uiout->field_signed ("refcount", gdata->refc);
1082   uiout->field_string ("addr", host_address_to_string (abfd));
1083   uiout->field_string ("filename", bfd_get_filename (abfd),
1084 		       file_name_style.style ());
1085   uiout->text ("\n");
1086 
1087   return 1;
1088 }
1089 
1090 /* Implement the 'maint info bfd' command.  */
1091 
1092 static void
1093 maintenance_info_bfds (const char *arg, int from_tty)
1094 {
1095   struct ui_out *uiout = current_uiout;
1096 
1097   ui_out_emit_table table_emitter (uiout, 3, -1, "bfds");
1098   uiout->table_header (10, ui_left, "refcount", "Refcount");
1099   uiout->table_header (18, ui_left, "addr", "Address");
1100   uiout->table_header (40, ui_left, "filename", "Filename");
1101 
1102   uiout->table_body ();
1103   htab_traverse (all_bfds, print_one_bfd, uiout);
1104 }
1105 
1106 /* BFD related per-inferior data.  */
1107 
1108 struct bfd_inferior_data
1109 {
1110   std::unordered_map<std::string, unsigned long> bfd_error_string_counts;
1111 };
1112 
1113 /* Per-inferior data key.  */
1114 
1115 static const registry<inferior>::key<bfd_inferior_data> bfd_inferior_data_key;
1116 
1117 /* Fetch per-inferior BFD data.  It always returns a valid pointer to
1118    a bfd_inferior_data struct.  */
1119 
1120 static struct bfd_inferior_data *
1121 get_bfd_inferior_data (struct inferior *inf)
1122 {
1123   struct bfd_inferior_data *data;
1124 
1125   data = bfd_inferior_data_key.get (inf);
1126   if (data == nullptr)
1127     data = bfd_inferior_data_key.emplace (inf);
1128 
1129   return data;
1130 }
1131 
1132 /* Increment the BFD error count for STR and return the updated
1133    count.  */
1134 
1135 static unsigned long
1136 increment_bfd_error_count (std::string str)
1137 {
1138   struct bfd_inferior_data *bid = get_bfd_inferior_data (current_inferior ());
1139 
1140   auto &map = bid->bfd_error_string_counts;
1141   return ++map[std::move (str)];
1142 }
1143 
1144 static bfd_error_handler_type default_bfd_error_handler;
1145 
1146 /* Define a BFD error handler which will suppress the printing of
1147    messages which have been printed once already.  This is done on a
1148    per-inferior basis.  */
1149 
1150 static void ATTRIBUTE_PRINTF (1, 0)
1151 gdb_bfd_error_handler (const char *fmt, va_list ap)
1152 {
1153   va_list ap_copy;
1154 
1155   va_copy(ap_copy, ap);
1156   const std::string str = string_vprintf (fmt, ap_copy);
1157   va_end (ap_copy);
1158 
1159   if (increment_bfd_error_count (std::move (str)) > 1)
1160     return;
1161 
1162   /* We must call the BFD mechanism for printing format strings since
1163      it supports additional format specifiers that GDB's vwarning() doesn't
1164      recognize.  It also outputs additional text, i.e. "BFD: ", which
1165      makes it clear that it's a BFD warning/error.  */
1166   (*default_bfd_error_handler) (fmt, ap);
1167 }
1168 
1169 void _initialize_gdb_bfd ();
1170 void
1171 _initialize_gdb_bfd ()
1172 {
1173   all_bfds = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
1174 				NULL, xcalloc, xfree);
1175 
1176   add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
1177 List the BFDs that are currently open."),
1178 	   &maintenanceinfolist);
1179 
1180   add_setshow_boolean_cmd ("bfd-sharing", no_class,
1181 			   &bfd_sharing, _("\
1182 Set whether gdb will share bfds that appear to be the same file."), _("\
1183 Show whether gdb will share bfds that appear to be the same file."), _("\
1184 When enabled gdb will reuse existing bfds rather than reopening the\n\
1185 same file.  To decide if two files are the same then gdb compares the\n\
1186 filename, file size, file modification time, and file inode."),
1187 			   NULL,
1188 			   &show_bfd_sharing,
1189 			   &maintenance_set_cmdlist,
1190 			   &maintenance_show_cmdlist);
1191 
1192   add_setshow_boolean_cmd ("bfd-cache", class_maintenance,
1193 			   &debug_bfd_cache,
1194 			   _("Set bfd cache debugging."),
1195 			   _("Show bfd cache debugging."),
1196 			   _("\
1197 When non-zero, bfd cache specific debugging is enabled."),
1198 			   NULL,
1199 			   &show_bfd_cache_debug,
1200 			   &setdebuglist, &showdebuglist);
1201 
1202   /* Hook the BFD error/warning handler to limit amount of output.  */
1203   default_bfd_error_handler = bfd_set_error_handler (gdb_bfd_error_handler);
1204 }
1205