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