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