1272343Sngie/* Darwin support for GDB, the GNU debugger. 2272343Sngie Copyright (C) 2008-2020 Free Software Foundation, Inc. 3272343Sngie 4272343Sngie Contributed by AdaCore. 5272343Sngie 6272343Sngie This file is part of GDB. 7272343Sngie 8272343Sngie This program is free software; you can redistribute it and/or modify 9272343Sngie it under the terms of the GNU General Public License as published by 10272343Sngie the Free Software Foundation; either version 3 of the License, or 11272343Sngie (at your option) any later version. 12272343Sngie 13272343Sngie This program is distributed in the hope that it will be useful, 14272343Sngie but WITHOUT ANY WARRANTY; without even the implied warranty of 15272343Sngie MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21#include "defs.h" 22#include "symtab.h" 23#include "gdbtypes.h" 24#include "bfd.h" 25#include "symfile.h" 26#include "objfiles.h" 27#include "gdbcmd.h" 28#include "gdbcore.h" 29#include "mach-o.h" 30#include "aout/stab_gnu.h" 31#include "complaints.h" 32#include "gdb_bfd.h" 33#include <string> 34#include <algorithm> 35 36/* If non-zero displays debugging message. */ 37static unsigned int mach_o_debug_level = 0; 38 39/* Dwarf debugging information are never in the final executable. They stay 40 in object files and the executable contains the list of object files read 41 during the link. 42 Each time an oso (other source) is found in the executable, the reader 43 creates such a structure. They are read after the processing of the 44 executable. */ 45 46struct oso_el 47{ 48 oso_el (asymbol **oso_sym_, asymbol **end_sym_, unsigned int nbr_syms_) 49 : name((*oso_sym_)->name), 50 mtime((*oso_sym_)->value), 51 oso_sym(oso_sym_), 52 end_sym(end_sym_), 53 nbr_syms(nbr_syms_) 54 { 55 } 56 57 /* Object file name. Can also be a member name. */ 58 const char *name; 59 60 /* Associated time stamp. */ 61 unsigned long mtime; 62 63 /* Stab symbols range for this OSO. */ 64 asymbol **oso_sym; 65 asymbol **end_sym; 66 67 /* Number of interesting stabs in the range. */ 68 unsigned int nbr_syms; 69}; 70 71static void 72macho_new_init (struct objfile *objfile) 73{ 74} 75 76static void 77macho_symfile_init (struct objfile *objfile) 78{ 79 objfile->flags |= OBJF_REORDERED; 80} 81 82/* Add symbol SYM to the minimal symbol table of OBJFILE. */ 83 84static void 85macho_symtab_add_minsym (minimal_symbol_reader &reader, 86 struct objfile *objfile, const asymbol *sym) 87{ 88 if (sym->name == NULL || *sym->name == '\0') 89 { 90 /* Skip names that don't exist (shouldn't happen), or names 91 that are null strings (may happen). */ 92 return; 93 } 94 95 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) 96 { 97 CORE_ADDR symaddr; 98 enum minimal_symbol_type ms_type; 99 100 /* Bfd symbols are section relative. */ 101 symaddr = sym->value + sym->section->vma; 102 103 if (sym->section == bfd_abs_section_ptr) 104 ms_type = mst_abs; 105 else if (sym->section->flags & SEC_CODE) 106 { 107 if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) 108 ms_type = mst_text; 109 else 110 ms_type = mst_file_text; 111 } 112 else if (sym->section->flags & SEC_ALLOC) 113 { 114 if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) 115 { 116 if (sym->section->flags & SEC_LOAD) 117 ms_type = mst_data; 118 else 119 ms_type = mst_bss; 120 } 121 else if (sym->flags & BSF_LOCAL) 122 { 123 /* Not a special stabs-in-elf symbol, do regular 124 symbol processing. */ 125 if (sym->section->flags & SEC_LOAD) 126 ms_type = mst_file_data; 127 else 128 ms_type = mst_file_bss; 129 } 130 else 131 ms_type = mst_unknown; 132 } 133 else 134 return; /* Skip this symbol. */ 135 136 reader.record_with_info (sym->name, symaddr, ms_type, 137 gdb_bfd_section_index (objfile->obfd, 138 sym->section)); 139 } 140} 141 142/* Build the minimal symbol table from SYMBOL_TABLE of length 143 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */ 144 145static void 146macho_symtab_read (minimal_symbol_reader &reader, 147 struct objfile *objfile, 148 long number_of_symbols, asymbol **symbol_table, 149 std::vector<oso_el> *oso_vector_ptr) 150{ 151 long i; 152 const asymbol *file_so = NULL; 153 asymbol **oso_file = NULL; 154 unsigned int nbr_syms = 0; 155 156 /* Current state while reading stabs. */ 157 enum 158 { 159 /* Not within an SO part. Only non-debugging symbols should be present, 160 and will be added to the minimal symbols table. */ 161 S_NO_SO, 162 163 /* First SO read. Introduce an SO section, and may be followed by a second 164 SO. The SO section should contain onl debugging symbols. */ 165 S_FIRST_SO, 166 167 /* Second non-null SO found, just after the first one. Means that the first 168 is in fact a directory name. */ 169 S_SECOND_SO, 170 171 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */ 172 S_DWARF_FILE, 173 174 S_STAB_FILE 175 } state = S_NO_SO; 176 177 for (i = 0; i < number_of_symbols; i++) 178 { 179 const asymbol *sym = symbol_table[i]; 180 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym; 181 182 switch (state) 183 { 184 case S_NO_SO: 185 if (mach_o_sym->n_type == N_SO) 186 { 187 /* Start of object stab. */ 188 if (sym->name == NULL || sym->name[0] == 0) 189 { 190 /* Unexpected empty N_SO. */ 191 complaint (_("Unexpected empty N_SO stab")); 192 } 193 else 194 { 195 file_so = sym; 196 state = S_FIRST_SO; 197 } 198 } 199 else if (sym->flags & BSF_DEBUGGING) 200 { 201 if (mach_o_sym->n_type == N_OPT) 202 { 203 /* No complaint for OPT. */ 204 break; 205 } 206 207 /* Debugging symbols are not expected here. */ 208 complaint (_("%s: Unexpected debug stab outside SO markers"), 209 objfile_name (objfile)); 210 } 211 else 212 { 213 /* Non-debugging symbols go to the minimal symbol table. */ 214 macho_symtab_add_minsym (reader, objfile, sym); 215 } 216 break; 217 218 case S_FIRST_SO: 219 case S_SECOND_SO: 220 if (mach_o_sym->n_type == N_SO) 221 { 222 if (sym->name == NULL || sym->name[0] == 0) 223 { 224 /* Unexpected empty N_SO. */ 225 complaint (_("Empty SO section")); 226 state = S_NO_SO; 227 } 228 else if (state == S_FIRST_SO) 229 { 230 /* Second SO stab for the file name. */ 231 file_so = sym; 232 state = S_SECOND_SO; 233 } 234 else 235 complaint (_("Three SO in a raw")); 236 } 237 else if (mach_o_sym->n_type == N_OSO) 238 { 239 if (sym->name == NULL || sym->name[0] == 0) 240 { 241 /* Empty OSO. Means that this file was compiled with 242 stabs. */ 243 state = S_STAB_FILE; 244 warning (_("stabs debugging not supported for %s"), 245 file_so->name); 246 } 247 else 248 { 249 /* Non-empty OSO for a Dwarf file. */ 250 oso_file = symbol_table + i; 251 nbr_syms = 0; 252 state = S_DWARF_FILE; 253 } 254 } 255 else 256 complaint (_("Unexpected stab after SO")); 257 break; 258 259 case S_STAB_FILE: 260 case S_DWARF_FILE: 261 if (mach_o_sym->n_type == N_SO) 262 { 263 if (sym->name == NULL || sym->name[0] == 0) 264 { 265 /* End of file. */ 266 if (state == S_DWARF_FILE) 267 oso_vector_ptr->emplace_back (oso_file, symbol_table + i, 268 nbr_syms); 269 state = S_NO_SO; 270 } 271 else 272 { 273 complaint (_("Missing nul SO")); 274 file_so = sym; 275 state = S_FIRST_SO; 276 } 277 } 278 else if (sym->flags & BSF_DEBUGGING) 279 { 280 if (state == S_STAB_FILE) 281 { 282 /* FIXME: to be implemented. */ 283 } 284 else 285 { 286 switch (mach_o_sym->n_type) 287 { 288 case N_FUN: 289 if (sym->name == NULL || sym->name[0] == 0) 290 break; 291 /* Fall through. */ 292 case N_STSYM: 293 /* Interesting symbol. */ 294 nbr_syms++; 295 break; 296 case N_ENSYM: 297 case N_BNSYM: 298 case N_GSYM: 299 break; 300 default: 301 complaint (_("unhandled stab for dwarf OSO file")); 302 break; 303 } 304 } 305 } 306 else 307 complaint (_("non-debugging symbol within SO")); 308 break; 309 } 310 } 311 312 if (state != S_NO_SO) 313 complaint (_("missing nul SO")); 314} 315 316/* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'), 317 returns the length of the archive name. 318 Returns -1 otherwise. */ 319 320static int 321get_archive_prefix_len (const char *name) 322{ 323 const char *lparen; 324 int name_len = strlen (name); 325 326 if (name_len == 0 || name[name_len - 1] != ')') 327 return -1; 328 329 lparen = strrchr (name, '('); 330 if (lparen == NULL || lparen == name) 331 return -1; 332 return lparen - name; 333} 334 335/* Compare function to std::sort OSOs, so that members of a library 336 are gathered. */ 337 338static bool 339oso_el_compare_name (const oso_el &l, const oso_el &r) 340{ 341 return strcmp (l.name, r.name) < 0; 342} 343 344/* Hash table entry structure for the stabs symbols in the main object file. 345 This is used to speed up lookup for symbols in the OSO. */ 346 347struct macho_sym_hash_entry 348{ 349 struct bfd_hash_entry base; 350 const asymbol *sym; 351}; 352 353/* Routine to create an entry in the hash table. */ 354 355static struct bfd_hash_entry * 356macho_sym_hash_newfunc (struct bfd_hash_entry *entry, 357 struct bfd_hash_table *table, 358 const char *string) 359{ 360 struct macho_sym_hash_entry *ret = (struct macho_sym_hash_entry *) entry; 361 362 /* Allocate the structure if it has not already been allocated by a 363 subclass. */ 364 if (ret == NULL) 365 ret = (struct macho_sym_hash_entry *) bfd_hash_allocate (table, 366 sizeof (* ret)); 367 if (ret == NULL) 368 return NULL; 369 370 /* Call the allocation method of the superclass. */ 371 ret = (struct macho_sym_hash_entry *) 372 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string); 373 374 if (ret) 375 { 376 /* Initialize the local fields. */ 377 ret->sym = NULL; 378 } 379 380 return (struct bfd_hash_entry *) ret; 381} 382 383/* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used 384 to get the value of global and common symbols. */ 385 386static CORE_ADDR 387macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym) 388{ 389 /* For common symbol and global symbols, use the min symtab. */ 390 struct bound_minimal_symbol msym; 391 const char *name = sym->name; 392 393 if (name[0] == bfd_get_symbol_leading_char (main_objfile->obfd)) 394 ++name; 395 msym = lookup_minimal_symbol (name, NULL, main_objfile); 396 if (msym.minsym == NULL) 397 { 398 warning (_("can't find symbol '%s' in minsymtab"), name); 399 return 0; 400 } 401 else 402 return BMSYMBOL_VALUE_ADDRESS (msym); 403} 404 405/* Add oso file OSO/ABFD as a symbol file. */ 406 407static void 408macho_add_oso_symfile (oso_el *oso, const gdb_bfd_ref_ptr &abfd, 409 const char *name, 410 struct objfile *main_objfile, 411 symfile_add_flags symfile_flags) 412{ 413 int storage; 414 int i; 415 asymbol **symbol_table; 416 asymbol **symp; 417 struct bfd_hash_table table; 418 int nbr_sections; 419 420 /* Per section flag to mark which section have been rebased. */ 421 unsigned char *sections_rebased; 422 423 if (mach_o_debug_level > 0) 424 printf_unfiltered 425 (_("Loading debugging symbols from oso: %s\n"), oso->name); 426 427 if (!bfd_check_format (abfd.get (), bfd_object)) 428 { 429 warning (_("`%s': can't read symbols: %s."), oso->name, 430 bfd_errmsg (bfd_get_error ())); 431 return; 432 } 433 434 if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd.get ())) 435 { 436 warning (_("`%s': file time stamp mismatch."), oso->name); 437 return; 438 } 439 440 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc, 441 sizeof (struct macho_sym_hash_entry), 442 oso->nbr_syms)) 443 { 444 warning (_("`%s': can't create hash table"), oso->name); 445 return; 446 } 447 448 bfd_set_cacheable (abfd.get (), 1); 449 450 /* Read symbols table. */ 451 storage = bfd_get_symtab_upper_bound (abfd.get ()); 452 symbol_table = (asymbol **) xmalloc (storage); 453 bfd_canonicalize_symtab (abfd.get (), symbol_table); 454 455 /* Init section flags. */ 456 nbr_sections = bfd_count_sections (abfd.get ()); 457 sections_rebased = (unsigned char *) alloca (nbr_sections); 458 for (i = 0; i < nbr_sections; i++) 459 sections_rebased[i] = 0; 460 461 /* Put symbols for the OSO file in the hash table. */ 462 for (symp = oso->oso_sym; symp != oso->end_sym; symp++) 463 { 464 const asymbol *sym = *symp; 465 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym; 466 467 switch (mach_o_sym->n_type) 468 { 469 case N_ENSYM: 470 case N_BNSYM: 471 case N_GSYM: 472 sym = NULL; 473 break; 474 case N_FUN: 475 if (sym->name == NULL || sym->name[0] == 0) 476 sym = NULL; 477 break; 478 case N_STSYM: 479 break; 480 default: 481 sym = NULL; 482 break; 483 } 484 if (sym != NULL) 485 { 486 struct macho_sym_hash_entry *ent; 487 488 ent = (struct macho_sym_hash_entry *) 489 bfd_hash_lookup (&table, sym->name, TRUE, FALSE); 490 if (ent->sym != NULL) 491 complaint (_("Duplicated symbol %s in symbol table"), sym->name); 492 else 493 { 494 if (mach_o_debug_level > 4) 495 { 496 struct gdbarch *arch = main_objfile->arch (); 497 printf_unfiltered 498 (_("Adding symbol %s (addr: %s)\n"), 499 sym->name, paddress (arch, sym->value)); 500 } 501 ent->sym = sym; 502 } 503 } 504 } 505 506 /* Relocate symbols of the OSO. */ 507 for (i = 0; symbol_table[i]; i++) 508 { 509 asymbol *sym = symbol_table[i]; 510 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym; 511 512 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB) 513 continue; 514 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF 515 && sym->value != 0) 516 { 517 /* For common symbol use the min symtab and modify the OSO 518 symbol table. */ 519 CORE_ADDR res; 520 521 res = macho_resolve_oso_sym_with_minsym (main_objfile, sym); 522 if (res != 0) 523 { 524 sym->section = bfd_com_section_ptr; 525 sym->value = res; 526 } 527 } 528 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT) 529 { 530 /* Normal symbol. */ 531 asection *sec = sym->section; 532 bfd_mach_o_section *msec; 533 unsigned int sec_type; 534 535 /* Skip buggy ones. */ 536 if (sec == NULL || sections_rebased[sec->index] != 0) 537 continue; 538 539 /* Only consider regular, non-debugging sections. */ 540 msec = bfd_mach_o_get_mach_o_section (sec); 541 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK; 542 if ((sec_type == BFD_MACH_O_S_REGULAR 543 || sec_type == BFD_MACH_O_S_ZEROFILL) 544 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0) 545 { 546 CORE_ADDR addr = 0; 547 548 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0) 549 { 550 /* Use the min symtab for global symbols. */ 551 addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym); 552 } 553 else 554 { 555 struct macho_sym_hash_entry *ent; 556 557 ent = (struct macho_sym_hash_entry *) 558 bfd_hash_lookup (&table, sym->name, FALSE, FALSE); 559 if (ent != NULL) 560 addr = bfd_asymbol_value (ent->sym); 561 } 562 563 /* Adjust the section. */ 564 if (addr != 0) 565 { 566 CORE_ADDR res = addr - sym->value; 567 568 if (mach_o_debug_level > 3) 569 { 570 struct gdbarch *arch = main_objfile->arch (); 571 printf_unfiltered 572 (_("resolve sect %s with %s (set to %s)\n"), 573 sec->name, sym->name, 574 paddress (arch, res)); 575 } 576 bfd_set_section_vma (sec, res); 577 sections_rebased[sec->index] = 1; 578 } 579 } 580 else 581 { 582 /* Mark the section as never rebased. */ 583 sections_rebased[sec->index] = 2; 584 } 585 } 586 } 587 588 bfd_hash_table_free (&table); 589 590 /* We need to clear SYMFILE_MAINLINE to avoid interactive question 591 from symfile.c:symbol_file_add_with_addrs_or_offsets. */ 592 symbol_file_add_from_bfd 593 (abfd.get (), name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), 594 NULL, 595 main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED 596 | OBJF_READNOW | OBJF_USERLOADED), 597 main_objfile); 598} 599 600/* Read symbols from the vector of oso files. 601 602 Note that this function sorts OSO_VECTOR_PTR. */ 603 604static void 605macho_symfile_read_all_oso (std::vector<oso_el> *oso_vector_ptr, 606 struct objfile *main_objfile, 607 symfile_add_flags symfile_flags) 608{ 609 int ix; 610 oso_el *oso; 611 612 /* Sort oso by name so that files from libraries are gathered. */ 613 std::sort (oso_vector_ptr->begin (), oso_vector_ptr->end (), 614 oso_el_compare_name); 615 616 for (ix = 0; ix < oso_vector_ptr->size ();) 617 { 618 int pfx_len; 619 620 oso = &(*oso_vector_ptr)[ix]; 621 622 /* Check if this is a library name. */ 623 pfx_len = get_archive_prefix_len (oso->name); 624 if (pfx_len > 0) 625 { 626 int last_ix; 627 oso_el *oso2; 628 int ix2; 629 630 std::string archive_name (oso->name, pfx_len); 631 632 /* Compute number of oso for this archive. */ 633 for (last_ix = ix; last_ix < oso_vector_ptr->size (); last_ix++) 634 { 635 oso2 = &(*oso_vector_ptr)[last_ix]; 636 if (strncmp (oso2->name, archive_name.c_str (), pfx_len) != 0) 637 break; 638 } 639 640 /* Open the archive and check the format. */ 641 gdb_bfd_ref_ptr archive_bfd (gdb_bfd_open (archive_name.c_str (), 642 gnutarget)); 643 if (archive_bfd == NULL) 644 { 645 warning (_("Could not open OSO archive file \"%s\""), 646 archive_name.c_str ()); 647 ix = last_ix; 648 continue; 649 } 650 if (!bfd_check_format (archive_bfd.get (), bfd_archive)) 651 { 652 warning (_("OSO archive file \"%s\" not an archive."), 653 archive_name.c_str ()); 654 ix = last_ix; 655 continue; 656 } 657 658 gdb_bfd_ref_ptr member_bfd 659 (gdb_bfd_openr_next_archived_file (archive_bfd.get (), NULL)); 660 661 if (member_bfd == NULL) 662 { 663 warning (_("Could not read archive members out of " 664 "OSO archive \"%s\""), archive_name.c_str ()); 665 ix = last_ix; 666 continue; 667 } 668 669 /* Load all oso in this library. */ 670 while (member_bfd != NULL) 671 { 672 const char *member_name = bfd_get_filename (member_bfd.get ()); 673 int member_len = strlen (member_name); 674 675 /* If this member is referenced, add it as a symfile. */ 676 for (ix2 = ix; ix2 < last_ix; ix2++) 677 { 678 oso2 = &(*oso_vector_ptr)[ix2]; 679 680 if (oso2->name 681 && strlen (oso2->name) == pfx_len + member_len + 2 682 && !memcmp (member_name, oso2->name + pfx_len + 1, 683 member_len)) 684 { 685 macho_add_oso_symfile (oso2, member_bfd, 686 bfd_get_filename (member_bfd.get ()), 687 main_objfile, symfile_flags); 688 oso2->name = NULL; 689 break; 690 } 691 } 692 693 member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd.get (), 694 member_bfd.get ()); 695 } 696 for (ix2 = ix; ix2 < last_ix; ix2++) 697 { 698 oso2 = &(*oso_vector_ptr)[ix2]; 699 700 if (oso2->name != NULL) 701 warning (_("Could not find specified archive member " 702 "for OSO name \"%s\""), oso->name); 703 } 704 ix = last_ix; 705 } 706 else 707 { 708 gdb_bfd_ref_ptr abfd (gdb_bfd_open (oso->name, gnutarget)); 709 if (abfd == NULL) 710 warning (_("`%s': can't open to read symbols: %s."), oso->name, 711 bfd_errmsg (bfd_get_error ())); 712 else 713 macho_add_oso_symfile (oso, abfd, oso->name, main_objfile, 714 symfile_flags); 715 716 ix++; 717 } 718 } 719} 720 721/* DSYM (debug symbols) files contain the debug info of an executable. 722 This is a separate file created by dsymutil(1) and is similar to debug 723 link feature on ELF. 724 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the 725 executable name and the executable base name to get the DSYM file name. */ 726#define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/" 727 728/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it 729 and return *FILENAMEP with its original filename. 730 Return NULL if no valid dsym file is found (FILENAMEP is not used in 731 such case). */ 732 733static gdb_bfd_ref_ptr 734macho_check_dsym (struct objfile *objfile, std::string *filenamep) 735{ 736 size_t name_len = strlen (objfile_name (objfile)); 737 size_t dsym_len = strlen (DSYM_SUFFIX); 738 const char *base_name = lbasename (objfile_name (objfile)); 739 size_t base_len = strlen (base_name); 740 char *dsym_filename = (char *) alloca (name_len + dsym_len + base_len + 1); 741 bfd_mach_o_load_command *main_uuid; 742 bfd_mach_o_load_command *dsym_uuid; 743 744 strcpy (dsym_filename, objfile_name (objfile)); 745 strcpy (dsym_filename + name_len, DSYM_SUFFIX); 746 strcpy (dsym_filename + name_len + dsym_len, base_name); 747 748 if (access (dsym_filename, R_OK) != 0) 749 return NULL; 750 751 if (bfd_mach_o_lookup_command (objfile->obfd, 752 BFD_MACH_O_LC_UUID, &main_uuid) == 0) 753 { 754 warning (_("can't find UUID in %s"), objfile_name (objfile)); 755 return NULL; 756 } 757 gdb_bfd_ref_ptr dsym_bfd (gdb_bfd_openr (dsym_filename, gnutarget)); 758 if (dsym_bfd == NULL) 759 { 760 warning (_("can't open dsym file %s"), dsym_filename); 761 return NULL; 762 } 763 764 if (!bfd_check_format (dsym_bfd.get (), bfd_object)) 765 { 766 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ())); 767 return NULL; 768 } 769 770 if (bfd_mach_o_lookup_command (dsym_bfd.get (), 771 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0) 772 { 773 warning (_("can't find UUID in %s"), dsym_filename); 774 return NULL; 775 } 776 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid, 777 sizeof (main_uuid->command.uuid.uuid))) 778 { 779 warning (_("dsym file UUID doesn't match the one in %s"), 780 objfile_name (objfile)); 781 return NULL; 782 } 783 *filenamep = std::string (dsym_filename); 784 return dsym_bfd; 785} 786 787static void 788macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) 789{ 790 bfd *abfd = objfile->obfd; 791 long storage_needed; 792 std::vector<oso_el> oso_vector; 793 /* We have to hold on to the symbol table until the call to 794 macho_symfile_read_all_oso at the end of this function. */ 795 gdb::def_vector<asymbol *> symbol_table; 796 797 /* Get symbols from the symbol table only if the file is an executable. 798 The symbol table of object files is not relocated and is expected to 799 be in the executable. */ 800 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC)) 801 { 802 std::string dsym_filename; 803 804 /* Process the normal symbol table first. */ 805 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); 806 if (storage_needed < 0) 807 error (_("Can't read symbols from %s: %s"), 808 bfd_get_filename (objfile->obfd), 809 bfd_errmsg (bfd_get_error ())); 810 811 if (storage_needed > 0) 812 { 813 long symcount; 814 815 symbol_table.resize (storage_needed / sizeof (asymbol *)); 816 817 minimal_symbol_reader reader (objfile); 818 819 symcount = bfd_canonicalize_symtab (objfile->obfd, 820 symbol_table.data ()); 821 822 if (symcount < 0) 823 error (_("Can't read symbols from %s: %s"), 824 bfd_get_filename (objfile->obfd), 825 bfd_errmsg (bfd_get_error ())); 826 827 macho_symtab_read (reader, objfile, symcount, symbol_table.data (), 828 &oso_vector); 829 830 reader.install (); 831 } 832 833 /* Try to read .eh_frame / .debug_frame. */ 834 /* First, locate these sections. We ignore the result status 835 as it only checks for debug info. */ 836 dwarf2_has_info (objfile, NULL); 837 dwarf2_build_frame_info (objfile); 838 839 /* Check for DSYM file. */ 840 gdb_bfd_ref_ptr dsym_bfd (macho_check_dsym (objfile, &dsym_filename)); 841 if (dsym_bfd != NULL) 842 { 843 struct bfd_section *asect, *dsect; 844 845 if (mach_o_debug_level > 0) 846 printf_unfiltered (_("dsym file found\n")); 847 848 /* Set dsym section size. */ 849 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections; 850 asect && dsect; 851 asect = asect->next, dsect = dsect->next) 852 { 853 if (strcmp (asect->name, dsect->name) != 0) 854 break; 855 bfd_set_section_size (dsect, bfd_section_size (asect)); 856 } 857 858 /* Add the dsym file as a separate file. */ 859 symbol_file_add_separate (dsym_bfd.get (), dsym_filename.c_str (), 860 symfile_flags, objfile); 861 862 /* Don't try to read dwarf2 from main file or shared libraries. */ 863 return; 864 } 865 } 866 867 if (dwarf2_has_info (objfile, NULL)) 868 { 869 /* DWARF 2 sections */ 870 dwarf2_build_psymtabs (objfile); 871 } 872 873 /* Then the oso. */ 874 if (!oso_vector.empty ()) 875 macho_symfile_read_all_oso (&oso_vector, objfile, symfile_flags); 876} 877 878static bfd_byte * 879macho_symfile_relocate (struct objfile *objfile, asection *sectp, 880 bfd_byte *buf) 881{ 882 bfd *abfd = objfile->obfd; 883 884 /* We're only interested in sections with relocation 885 information. */ 886 if ((sectp->flags & SEC_RELOC) == 0) 887 return NULL; 888 889 if (mach_o_debug_level > 0) 890 printf_unfiltered (_("Relocate section '%s' of %s\n"), 891 sectp->name, objfile_name (objfile)); 892 893 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL); 894} 895 896static void 897macho_symfile_finish (struct objfile *objfile) 898{ 899} 900 901static void 902macho_symfile_offsets (struct objfile *objfile, 903 const section_addr_info &addrs) 904{ 905 unsigned int i; 906 struct obj_section *osect; 907 908 /* Allocate section_offsets. */ 909 objfile->section_offsets.assign (bfd_count_sections (objfile->obfd), 0); 910 911 /* This code is run when we first add the objfile with 912 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are 913 passed in. The place in symfile.c where the addrs are applied 914 depends on the addrs having section names. But in the dyld code 915 we build an anonymous array of addrs, so that code is a no-op. 916 Because of that, we have to apply the addrs to the sections here. 917 N.B. if an objfile slides after we've already created it, then it 918 goes through objfile_relocate. */ 919 920 for (i = 0; i < addrs.size (); i++) 921 { 922 ALL_OBJFILE_OSECTIONS (objfile, osect) 923 { 924 const char *bfd_sect_name = osect->the_bfd_section->name; 925 926 if (bfd_sect_name == addrs[i].name) 927 { 928 obj_section_offset (osect) = addrs[i].addr; 929 break; 930 } 931 } 932 } 933 934 objfile->sect_index_text = 0; 935 936 ALL_OBJFILE_OSECTIONS (objfile, osect) 937 { 938 const char *bfd_sect_name = osect->the_bfd_section->name; 939 int sect_index = osect - objfile->sections;; 940 941 if (startswith (bfd_sect_name, "LC_SEGMENT.")) 942 bfd_sect_name += 11; 943 if (strcmp (bfd_sect_name, "__TEXT") == 0 944 || strcmp (bfd_sect_name, "__TEXT.__text") == 0) 945 objfile->sect_index_text = sect_index; 946 } 947} 948 949static const struct sym_fns macho_sym_fns = { 950 macho_new_init, /* init anything gbl to entire symtab */ 951 macho_symfile_init, /* read initial info, setup for sym_read() */ 952 macho_symfile_read, /* read a symbol file into symtab */ 953 NULL, /* sym_read_psymbols */ 954 macho_symfile_finish, /* finished with file, cleanup */ 955 macho_symfile_offsets, /* xlate external to internal form */ 956 default_symfile_segments, /* Get segment information from a file. */ 957 NULL, 958 macho_symfile_relocate, /* Relocate a debug section. */ 959 NULL, /* sym_get_probes */ 960 &psym_functions 961}; 962 963void _initialize_machoread (); 964void 965_initialize_machoread () 966{ 967 add_symtab_fns (bfd_target_mach_o_flavour, &macho_sym_fns); 968 969 add_setshow_zuinteger_cmd ("mach-o", class_obscure, 970 &mach_o_debug_level, 971 _("Set if printing Mach-O symbols processing."), 972 _("Show if printing Mach-O symbols processing."), 973 NULL, NULL, NULL, 974 &setdebuglist, &showdebuglist); 975} 976