1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008, 2009 Free Software Foundation, Inc.
4 Contributed by AdaCore.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
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/>.
32 #include "gdb_assert.h"
33 #include "aout/stab_gnu.h"
38 /* If non-zero displays debugging message. */
39 static int mach_o_debug_level = 0;
42 macho_new_init (struct objfile *objfile)
47 macho_symfile_init (struct objfile *objfile)
49 objfile->flags |= OBJF_REORDERED;
50 init_entry_point_info (objfile);
53 /* Dwarf debugging information are never in the final executable. They stay
54 in object files and the executable contains the list of object files read
56 Each time an oso (other source) is found in the executable, the reader
57 creates such a structure. They are read after the processing of the
62 /* Object file name. */
65 /* Associated time stamp. */
68 /* Number of sections. This is the length of SYMBOLS and OFFSETS array. */
71 /* Each seaction of the object file is represented by a symbol and its
78 /* Vector of object files to be read after the executable. */
80 static VEC (oso_el) *oso_vector;
82 /* Add a new OSO to the vector. */
85 macho_add_oso (const asymbol *oso_sym, int nbr_sections,
86 asymbol **symbols, bfd_vma *offsets)
90 el.name = oso_sym->name;
91 el.mtime = oso_sym->value;
92 el.num_sections = nbr_sections;
95 VEC_safe_push (oso_el, oso_vector, &el);
98 /* Build the minimal symbol table from SYMBOL_TABLE of length
99 NUMBER_OF_SYMBOLS for OBJFILE.
100 Read OSO files at the end. */
103 macho_symtab_read (struct objfile *objfile,
104 long number_of_symbols, asymbol **symbol_table)
106 struct gdbarch *gdbarch = get_objfile_arch (objfile);
110 enum minimal_symbol_type ms_type;
111 unsigned int nbr_sections = bfd_count_sections (objfile->obfd);
112 asymbol **first_symbol = NULL;
113 bfd_vma *first_offset = NULL;
114 const asymbol *oso_file = NULL;
116 for (i = 0; i < number_of_symbols; i++)
118 asymbol *sym = symbol_table[i];
119 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
121 offset = ANOFFSET (objfile->section_offsets, sym->section->index);
123 if (sym->flags & BSF_DEBUGGING)
127 switch (mach_o_sym->n_type)
130 if ((sym->name == NULL || sym->name[0] == 0)
133 macho_add_oso (oso_file, nbr_sections,
134 first_symbol, first_offset);
142 if (sym->name == NULL || sym->name[0] == '\0')
146 gdb_assert (oso_file != NULL);
148 + bfd_get_section_vma (sym->section->bfd, sym->section);
150 && first_symbol[sym->section->index] == NULL)
152 first_symbol[sym->section->index] = sym;
153 first_offset[sym->section->index] = addr + offset;
157 gdb_assert (oso_file != NULL);
158 if (first_symbol[sym->section->index] == NULL)
159 first_symbol[sym->section->index] = sym;
162 gdb_assert (oso_file == NULL);
163 first_symbol = (asymbol **)xmalloc (nbr_sections
164 * sizeof (asymbol *));
165 first_offset = (bfd_vma *)xmalloc (nbr_sections
167 for (j = 0; j < nbr_sections; j++)
168 first_symbol[j] = NULL;
175 if (sym->name == NULL || *sym->name == '\0')
177 /* Skip names that don't exist (shouldn't happen), or names
178 that are null strings (may happen). */
182 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
184 struct minimal_symbol *msym;
187 /* Bfd symbols are section relative. */
188 symaddr = sym->value + sym->section->vma;
190 /* Select global/local/weak symbols. Note that bfd puts abs
191 symbols in their own section, so all symbols we are
192 interested in will have a section. */
193 /* Relocate all non-absolute and non-TLS symbols by the
195 if (sym->section != &bfd_abs_section
196 && !(sym->section->flags & SEC_THREAD_LOCAL))
199 if (sym->section == &bfd_abs_section)
201 else if (sym->section->flags & SEC_CODE)
203 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
206 ms_type = mst_file_text;
208 else if (sym->section->flags & SEC_ALLOC)
210 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
212 if (sym->section->flags & SEC_LOAD)
217 else if (sym->flags & BSF_LOCAL)
219 /* Not a special stabs-in-elf symbol, do regular
220 symbol processing. */
221 if (sym->section->flags & SEC_LOAD)
222 ms_type = mst_file_data;
224 ms_type = mst_file_bss;
227 ms_type = mst_unknown;
230 continue; /* Skip this symbol. */
232 gdb_assert (sym->section->index < nbr_sections);
234 && first_symbol[sym->section->index] == NULL)
236 first_symbol[sym->section->index] = sym;
237 first_offset[sym->section->index] = symaddr;
240 msym = prim_record_minimal_symbol_and_info
241 (sym->name, symaddr, ms_type, sym->section->index,
242 sym->section, objfile);
246 if (oso_file != NULL)
247 macho_add_oso (oso_file, nbr_sections, first_symbol, first_offset);
250 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
251 returns the length of the archive name.
252 Returns -1 otherwise. */
255 get_archive_prefix_len (const char *name)
258 int name_len = strlen (name);
260 if (name_len == 0 || name[name_len - 1] != ')')
263 lparen = strrchr (name, '(');
264 if (lparen == NULL || lparen == name)
266 return lparen - name;
270 oso_el_compare_name (const void *vl, const void *vr)
272 const oso_el *l = (const oso_el *)vl;
273 const oso_el *r = (const oso_el *)vr;
275 return strcmp (l->name, r->name);
278 /* Add an oso file as a symbol file. */
281 macho_add_oso_symfile (oso_el *oso, bfd *abfd, struct objfile *main_objfile)
283 struct section_addr_info *addrs;
288 if (mach_o_debug_level > 0)
289 printf_unfiltered (_("Loading symbols from oso: %s\n"), oso->name);
291 if (!bfd_check_format (abfd, bfd_object))
293 warning (_("`%s': can't read symbols: %s."), oso->name,
294 bfd_errmsg (bfd_get_error ()));
299 bfd_set_cacheable (abfd, 1);
301 /* Compute addr length. */
303 for (i = 0; i < oso->num_sections; i++)
304 if (oso->symbols[i] != NULL)
307 addrs = alloc_section_addr_info (len);
309 leading_char = bfd_get_symbol_leading_char (main_objfile->obfd);
312 for (i = 0; i < oso->num_sections; i++)
313 if (oso->symbols[i] != NULL)
316 addrs->other[len].addr = oso->offsets[i];
319 struct minimal_symbol *msym;
320 const char *name = oso->symbols[i]->name;
322 if (name[0] == leading_char)
325 if (mach_o_debug_level > 3)
326 printf_unfiltered (_("resolve sect %s with %s\n"),
327 oso->symbols[i]->section->name,
328 oso->symbols[i]->name);
329 msym = lookup_minimal_symbol (name, NULL, main_objfile);
332 warning (_("can't find symbol '%s' in minsymtab"),
333 oso->symbols[i]->name);
334 addrs->other[len].addr = 0;
337 addrs->other[len].addr = SYMBOL_VALUE_ADDRESS (msym);
339 addrs->other[len].name = (char *)oso->symbols[i]->section->name;
343 if (mach_o_debug_level > 1)
346 for (j = 0; j < addrs->num_sections; j++)
347 printf_unfiltered (_(" %s: %s\n"),
348 core_addr_to_string (addrs->other[j].addr),
349 addrs->other[j].name);
352 symbol_file_add_from_bfd (abfd, 0, addrs, 0);
355 /* Read symbols from the vector of oso files. */
358 macho_oso_symfile (struct objfile *main_objfile)
367 /* Sort oso by name so that files from libraries are gathered. */
368 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
369 sizeof (oso_el), oso_el_compare_name);
371 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
375 /* Check if this is a library name. */
376 pfx_len = get_archive_prefix_len (oso->name);
381 char *archive_name = XNEWVEC (char, pfx_len + 1);
386 memcpy (archive_name, oso->name, pfx_len);
387 archive_name[pfx_len] = '\0';
389 /* Compute number of oso for this archive. */
391 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
393 if (strncmp (oso2->name, archive_name, pfx_len) != 0)
397 /* Open the archive and check the format. */
398 archive_bfd = bfd_openr (archive_name, gnutarget);
399 if (archive_bfd == NULL)
401 warning (_("Could not open OSO archive file \"%s\""),
406 if (!bfd_check_format (archive_bfd, bfd_archive))
408 warning (_("OSO archive file \"%s\" not an archive."),
410 bfd_close (archive_bfd);
414 member_bfd = bfd_openr_next_archived_file (archive_bfd, NULL);
416 if (member_bfd == NULL)
418 warning (_("Could not read archive members out of "
419 "OSO archive \"%s\""), archive_name);
420 bfd_close (archive_bfd);
425 /* Load all oso in this library. */
426 while (member_bfd != NULL)
429 const char *member_name = member_bfd->filename;
430 int member_len = strlen (member_name);
432 /* If this member is referenced, add it as a symfile. */
433 for (ix2 = ix; ix2 < last_ix; ix2++)
435 oso2 = VEC_index (oso_el, vec, ix2);
438 && strlen (oso2->name) == pfx_len + member_len + 2
439 && !memcmp (member_name, oso2->name + pfx_len + 1,
442 macho_add_oso_symfile (oso2, member_bfd, main_objfile);
449 member_bfd = bfd_openr_next_archived_file
450 (archive_bfd, member_bfd);
452 /* Free previous member if not referenced by an oso. */
456 for (ix2 = ix; ix2 < last_ix; ix2++)
458 oso_el *oso2 = VEC_index (oso_el, vec, ix2);
460 if (oso2->name != NULL)
461 warning (_("Could not find specified archive member "
462 "for OSO name \"%s\""), oso->name);
470 abfd = bfd_openr (oso->name, gnutarget);
472 warning (_("`%s': can't open to read symbols: %s."), oso->name,
473 bfd_errmsg (bfd_get_error ()));
475 macho_add_oso_symfile (oso, abfd, main_objfile);
481 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso); ix++)
483 xfree (oso->symbols);
484 xfree (oso->offsets);
486 VEC_free (oso_el, vec);
489 /* DSYM (debug symbols) files contain the debug info of an executable.
490 This is a separate file created by dsymutil(1) and is similar to debug
492 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
493 executable name and the executable base name to get the DSYM file name. */
494 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
496 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
497 Return NULL if no valid dsym file is found. */
500 macho_check_dsym (struct objfile *objfile)
502 size_t name_len = strlen (objfile->name);
503 size_t dsym_len = strlen (DSYM_SUFFIX);
504 const char *base_name = lbasename (objfile->name);
505 size_t base_len = strlen (base_name);
506 char *dsym_filename = alloca (name_len + dsym_len + base_len + 1);
509 bfd_byte main_uuid[16];
510 bfd_byte dsym_uuid[16];
512 strcpy (dsym_filename, objfile->name);
513 strcpy (dsym_filename + name_len, DSYM_SUFFIX);
514 strcpy (dsym_filename + name_len + dsym_len, base_name);
516 if (access (dsym_filename, R_OK) != 0)
519 sect = bfd_get_section_by_name (objfile->obfd, "LC_UUID");
522 warning (_("can't find UUID in %s"), objfile->name);
525 if (!bfd_get_section_contents (objfile->obfd, sect, main_uuid,
526 0, sizeof (main_uuid)))
528 warning (_("can't read UUID in %s"), objfile->name);
532 dsym_filename = xstrdup (dsym_filename);
533 dsym_bfd = bfd_openr (dsym_filename, gnutarget);
534 if (dsym_bfd == NULL)
536 warning (_("can't open dsym file %s"), dsym_filename);
537 xfree (dsym_filename);
541 if (!bfd_check_format (dsym_bfd, bfd_object))
543 bfd_close (dsym_bfd);
544 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
545 xfree (dsym_filename);
549 sect = bfd_get_section_by_name (dsym_bfd, "LC_UUID");
552 warning (_("can't find UUID in %s"), dsym_filename);
553 bfd_close (dsym_bfd);
554 xfree (dsym_filename);
557 if (!bfd_get_section_contents (dsym_bfd, sect, dsym_uuid,
558 0, sizeof (dsym_uuid)))
560 warning (_("can't read UUID in %s"), dsym_filename);
561 bfd_close (dsym_bfd);
562 xfree (dsym_filename);
565 if (memcmp (dsym_uuid, main_uuid, sizeof (main_uuid)))
567 warning (_("dsym file UUID doesn't match the one in %s"), objfile->name);
568 bfd_close (dsym_bfd);
569 xfree (dsym_filename);
577 macho_symfile_read (struct objfile *objfile, int mainline)
579 bfd *abfd = objfile->obfd;
580 struct cleanup *back_to;
585 init_minimal_symbol_collection ();
586 back_to = make_cleanup_discard_minimal_symbols ();
588 /* Get symbols from the symbol table only if the file is an executable.
589 The symbol table of object files is not relocated and is expected to
590 be in the executable. */
591 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
593 /* Process the normal symbol table first. */
594 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
595 if (storage_needed < 0)
596 error (_("Can't read symbols from %s: %s"),
597 bfd_get_filename (objfile->obfd),
598 bfd_errmsg (bfd_get_error ()));
600 if (storage_needed > 0)
602 asymbol **symbol_table;
605 symbol_table = (asymbol **) xmalloc (storage_needed);
606 make_cleanup (xfree, symbol_table);
607 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
610 error (_("Can't read symbols from %s: %s"),
611 bfd_get_filename (objfile->obfd),
612 bfd_errmsg (bfd_get_error ()));
614 macho_symtab_read (objfile, symcount, symbol_table);
617 install_minimal_symbols (objfile);
619 /* Try to read .eh_frame / .debug_frame. */
620 /* First, locate these sections. We ignore the result status
621 as it only checks for debug info. */
622 dwarf2_has_info (objfile);
623 dwarf2_build_frame_info (objfile);
625 /* Check for DSYM file. */
626 dsym_bfd = macho_check_dsym (objfile);
627 if (dsym_bfd != NULL)
632 if (mach_o_debug_level > 0)
633 printf_unfiltered (_("dsym file found\n"));
635 /* Remove oso. They won't be used. */
636 for (ix = 0; VEC_iterate (oso_el, oso_vector, ix, oso); ix++)
638 xfree (oso->symbols);
639 xfree (oso->offsets);
641 VEC_free (oso_el, oso_vector);
644 /* Now recurse: read dwarf from dsym. */
645 symbol_file_add_from_bfd (dsym_bfd, 0, NULL, 0);
647 /* Don't try to read dwarf2 from main file or shared libraries. */
652 if (dwarf2_has_info (objfile))
654 /* DWARF 2 sections */
655 dwarf2_build_psymtabs (objfile, mainline);
658 /* Do not try to read .eh_frame/.debug_frame as they are not relocated
659 and dwarf2_build_frame_info cannot deal with unrelocated sections. */
662 if (oso_vector != NULL)
663 macho_oso_symfile (objfile);
667 macho_symfile_finish (struct objfile *objfile)
672 macho_symfile_offsets (struct objfile *objfile,
673 struct section_addr_info *addrs)
676 unsigned int num_sections;
677 struct obj_section *osect;
679 /* Allocate section_offsets. */
680 objfile->num_sections = bfd_count_sections (objfile->obfd);
681 objfile->section_offsets = (struct section_offsets *)
682 obstack_alloc (&objfile->objfile_obstack,
683 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
684 memset (objfile->section_offsets, 0,
685 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
687 /* This code is run when we first add the objfile with
688 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
689 passed in. The place in symfile.c where the addrs are applied
690 depends on the addrs having section names. But in the dyld code
691 we build an anonymous array of addrs, so that code is a no-op.
692 Because of that, we have to apply the addrs to the sections here.
693 N.B. if an objfile slides after we've already created it, then it
694 goes through objfile_relocate. */
696 for (i = 0; i < addrs->num_sections; i++)
698 if (addrs->other[i].name == NULL)
701 ALL_OBJFILE_OSECTIONS (objfile, osect)
703 const char *bfd_sect_name = osect->the_bfd_section->name;
705 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
707 obj_section_offset (osect) = addrs->other[i].addr;
713 objfile->sect_index_text = 0;
715 ALL_OBJFILE_OSECTIONS (objfile, osect)
717 const char *bfd_sect_name = osect->the_bfd_section->name;
718 int sect_index = osect->the_bfd_section->index;
720 if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0)
722 if (strcmp (bfd_sect_name, "__TEXT") == 0
723 || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
724 objfile->sect_index_text = sect_index;
728 static struct sym_fns macho_sym_fns = {
729 bfd_target_mach_o_flavour,
731 macho_new_init, /* sym_new_init: init anything gbl to entire symtab */
732 macho_symfile_init, /* sym_init: read initial info, setup for sym_read() */
733 macho_symfile_read, /* sym_read: read a symbol file into symtab */
734 macho_symfile_finish, /* sym_finish: finished with file, cleanup */
735 macho_symfile_offsets, /* sym_offsets: xlate external to internal form */
736 NULL /* next: pointer to next struct sym_fns */
740 _initialize_machoread ()
742 add_symtab_fns (&macho_sym_fns);
744 add_setshow_zinteger_cmd ("mach-o", class_obscure,
745 &mach_o_debug_level, _("\
746 Set if printing Mach-O symbols processing."), _("\
747 Show if printing Mach-O symbols processing."), NULL,
749 &setdebuglist, &showdebuglist);