1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2016 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/>. */
31 #include "aout/stab_gnu.h"
34 #include "complaints.h"
38 /* If non-zero displays debugging message. */
39 static unsigned int mach_o_debug_level
= 0;
41 /* Dwarf debugging information are never in the final executable. They stay
42 in object files and the executable contains the list of object files read
44 Each time an oso (other source) is found in the executable, the reader
45 creates such a structure. They are read after the processing of the
50 /* Object file name. Can also be a member name. */
53 /* Associated time stamp. */
56 /* Stab symbols range for this OSO. */
60 /* Number of interesting stabs in the range. */
61 unsigned int nbr_syms
;
65 /* Vector of object files to be read after the executable. */
69 macho_new_init (struct objfile
*objfile
)
74 macho_symfile_init (struct objfile
*objfile
)
76 objfile
->flags
|= OBJF_REORDERED
;
79 /* Add a new OSO to the vector of OSO to load. */
82 macho_register_oso (VEC (oso_el
) **oso_vector_ptr
,
83 struct objfile
*objfile
,
84 asymbol
**oso_sym
, asymbol
**end_sym
,
85 unsigned int nbr_syms
)
89 el
.name
= (*oso_sym
)->name
;
90 el
.mtime
= (*oso_sym
)->value
;
93 el
.nbr_syms
= nbr_syms
;
94 VEC_safe_push (oso_el
, *oso_vector_ptr
, &el
);
97 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
100 macho_symtab_add_minsym (minimal_symbol_reader
&reader
,
101 struct objfile
*objfile
, const asymbol
*sym
)
103 if (sym
->name
== NULL
|| *sym
->name
== '\0')
105 /* Skip names that don't exist (shouldn't happen), or names
106 that are null strings (may happen). */
110 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
113 enum minimal_symbol_type ms_type
;
115 /* Bfd symbols are section relative. */
116 symaddr
= sym
->value
+ sym
->section
->vma
;
118 if (sym
->section
== bfd_abs_section_ptr
)
120 else if (sym
->section
->flags
& SEC_CODE
)
122 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
125 ms_type
= mst_file_text
;
127 else if (sym
->section
->flags
& SEC_ALLOC
)
129 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
131 if (sym
->section
->flags
& SEC_LOAD
)
136 else if (sym
->flags
& BSF_LOCAL
)
138 /* Not a special stabs-in-elf symbol, do regular
139 symbol processing. */
140 if (sym
->section
->flags
& SEC_LOAD
)
141 ms_type
= mst_file_data
;
143 ms_type
= mst_file_bss
;
146 ms_type
= mst_unknown
;
149 return; /* Skip this symbol. */
151 reader
.record_with_info (sym
->name
, symaddr
, ms_type
,
152 gdb_bfd_section_index (objfile
->obfd
,
157 /* Build the minimal symbol table from SYMBOL_TABLE of length
158 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
161 macho_symtab_read (minimal_symbol_reader
&reader
,
162 struct objfile
*objfile
,
163 long number_of_symbols
, asymbol
**symbol_table
,
164 VEC (oso_el
) **oso_vector_ptr
)
167 const asymbol
*file_so
= NULL
;
168 asymbol
**oso_file
= NULL
;
169 unsigned int nbr_syms
= 0;
171 /* Current state while reading stabs. */
174 /* Not within an SO part. Only non-debugging symbols should be present,
175 and will be added to the minimal symbols table. */
178 /* First SO read. Introduce an SO section, and may be followed by a second
179 SO. The SO section should contain onl debugging symbols. */
182 /* Second non-null SO found, just after the first one. Means that the first
183 is in fact a directory name. */
186 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
192 for (i
= 0; i
< number_of_symbols
; i
++)
194 const asymbol
*sym
= symbol_table
[i
];
195 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
200 if (mach_o_sym
->n_type
== N_SO
)
202 /* Start of object stab. */
203 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
205 /* Unexpected empty N_SO. */
206 complaint (&symfile_complaints
,
207 _("Unexpected empty N_SO stab"));
215 else if (sym
->flags
& BSF_DEBUGGING
)
217 if (mach_o_sym
->n_type
== N_OPT
)
219 /* No complaint for OPT. */
223 /* Debugging symbols are not expected here. */
224 complaint (&symfile_complaints
,
225 _("%s: Unexpected debug stab outside SO markers"),
226 objfile_name (objfile
));
230 /* Non-debugging symbols go to the minimal symbol table. */
231 macho_symtab_add_minsym (reader
, objfile
, sym
);
237 if (mach_o_sym
->n_type
== N_SO
)
239 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
241 /* Unexpected empty N_SO. */
242 complaint (&symfile_complaints
, _("Empty SO section"));
245 else if (state
== S_FIRST_SO
)
247 /* Second SO stab for the file name. */
252 complaint (&symfile_complaints
, _("Three SO in a raw"));
254 else if (mach_o_sym
->n_type
== N_OSO
)
256 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
258 /* Empty OSO. Means that this file was compiled with
261 warning (_("stabs debugging not supported for %s"),
266 /* Non-empty OSO for a Dwarf file. */
267 oso_file
= symbol_table
+ i
;
269 state
= S_DWARF_FILE
;
273 complaint (&symfile_complaints
,
274 _("Unexpected stab after SO"));
279 if (mach_o_sym
->n_type
== N_SO
)
281 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
284 if (state
== S_DWARF_FILE
)
285 macho_register_oso (oso_vector_ptr
, objfile
,
286 oso_file
, symbol_table
+ i
,
292 complaint (&symfile_complaints
, _("Missing nul SO"));
297 else if (sym
->flags
& BSF_DEBUGGING
)
299 if (state
== S_STAB_FILE
)
301 /* FIXME: to be implemented. */
305 switch (mach_o_sym
->n_type
)
308 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
312 /* Interesting symbol. */
320 complaint (&symfile_complaints
,
321 _("unhandled stab for dwarf OSO file"));
327 complaint (&symfile_complaints
,
328 _("non-debugging symbol within SO"));
333 if (state
!= S_NO_SO
)
334 complaint (&symfile_complaints
, _("missing nul SO"));
337 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
338 returns the length of the archive name.
339 Returns -1 otherwise. */
342 get_archive_prefix_len (const char *name
)
345 int name_len
= strlen (name
);
347 if (name_len
== 0 || name
[name_len
- 1] != ')')
350 lparen
= strrchr (name
, '(');
351 if (lparen
== NULL
|| lparen
== name
)
353 return lparen
- name
;
356 /* Compare function to qsort OSOs, so that members of a library are
360 oso_el_compare_name (const void *vl
, const void *vr
)
362 const oso_el
*l
= (const oso_el
*)vl
;
363 const oso_el
*r
= (const oso_el
*)vr
;
365 return strcmp (l
->name
, r
->name
);
368 /* Hash table entry structure for the stabs symbols in the main object file.
369 This is used to speed up lookup for symbols in the OSO. */
371 struct macho_sym_hash_entry
373 struct bfd_hash_entry base
;
377 /* Routine to create an entry in the hash table. */
379 static struct bfd_hash_entry
*
380 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
381 struct bfd_hash_table
*table
,
384 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
386 /* Allocate the structure if it has not already been allocated by a
389 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
394 /* Call the allocation method of the superclass. */
395 ret
= (struct macho_sym_hash_entry
*)
396 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
400 /* Initialize the local fields. */
404 return (struct bfd_hash_entry
*) ret
;
407 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
408 to get the value of global and common symbols. */
411 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
413 /* For common symbol and global symbols, use the min symtab. */
414 struct bound_minimal_symbol msym
;
415 const char *name
= sym
->name
;
417 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
419 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
420 if (msym
.minsym
== NULL
)
422 warning (_("can't find symbol '%s' in minsymtab"), name
);
426 return BMSYMBOL_VALUE_ADDRESS (msym
);
429 /* Add oso file OSO/ABFD as a symbol file. */
432 macho_add_oso_symfile (oso_el
*oso
, bfd
*abfd
, const char *name
,
433 struct objfile
*main_objfile
,
434 symfile_add_flags symfile_flags
)
438 asymbol
**symbol_table
;
440 struct bfd_hash_table table
;
442 struct cleanup
*cleanup
;
444 /* Per section flag to mark which section have been rebased. */
445 unsigned char *sections_rebased
;
447 if (mach_o_debug_level
> 0)
449 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
451 if (!bfd_check_format (abfd
, bfd_object
))
453 warning (_("`%s': can't read symbols: %s."), oso
->name
,
454 bfd_errmsg (bfd_get_error ()));
455 gdb_bfd_unref (abfd
);
459 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
))
461 warning (_("`%s': file time stamp mismatch."), oso
->name
);
462 gdb_bfd_unref (abfd
);
466 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
467 sizeof (struct macho_sym_hash_entry
),
470 warning (_("`%s': can't create hash table"), oso
->name
);
471 gdb_bfd_unref (abfd
);
475 bfd_set_cacheable (abfd
, 1);
477 /* Read symbols table. */
478 storage
= bfd_get_symtab_upper_bound (abfd
);
479 symbol_table
= (asymbol
**) xmalloc (storage
);
480 bfd_canonicalize_symtab (abfd
, symbol_table
);
482 /* Init section flags. */
483 nbr_sections
= bfd_count_sections (abfd
);
484 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
485 for (i
= 0; i
< nbr_sections
; i
++)
486 sections_rebased
[i
] = 0;
488 /* Put symbols for the OSO file in the hash table. */
489 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
491 const asymbol
*sym
= *symp
;
492 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
494 switch (mach_o_sym
->n_type
)
502 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
513 struct macho_sym_hash_entry
*ent
;
515 ent
= (struct macho_sym_hash_entry
*)
516 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
517 if (ent
->sym
!= NULL
)
518 complaint (&symfile_complaints
,
519 _("Duplicated symbol %s in symbol table"), sym
->name
);
522 if (mach_o_debug_level
> 4)
524 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
526 (_("Adding symbol %s (addr: %s)\n"),
527 sym
->name
, paddress (arch
, sym
->value
));
534 /* Relocate symbols of the OSO. */
535 for (i
= 0; symbol_table
[i
]; i
++)
537 asymbol
*sym
= symbol_table
[i
];
538 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
540 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
542 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
545 /* For common symbol use the min symtab and modify the OSO
549 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
552 sym
->section
= bfd_com_section_ptr
;
556 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
559 asection
*sec
= sym
->section
;
560 bfd_mach_o_section
*msec
;
561 unsigned int sec_type
;
563 /* Skip buggy ones. */
564 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
567 /* Only consider regular, non-debugging sections. */
568 msec
= bfd_mach_o_get_mach_o_section (sec
);
569 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
570 if ((sec_type
== BFD_MACH_O_S_REGULAR
571 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
572 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
576 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
578 /* Use the min symtab for global symbols. */
579 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
583 struct macho_sym_hash_entry
*ent
;
585 ent
= (struct macho_sym_hash_entry
*)
586 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
588 addr
= bfd_asymbol_value (ent
->sym
);
591 /* Adjust the section. */
594 CORE_ADDR res
= addr
- sym
->value
;
596 if (mach_o_debug_level
> 3)
598 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
600 (_("resolve sect %s with %s (set to %s)\n"),
601 sec
->name
, sym
->name
,
602 paddress (arch
, res
));
604 bfd_set_section_vma (abfd
, sec
, res
);
605 sections_rebased
[sec
->index
] = 1;
610 /* Mark the section as never rebased. */
611 sections_rebased
[sec
->index
] = 2;
616 bfd_hash_table_free (&table
);
618 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
619 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
620 cleanup
= make_cleanup_bfd_unref (abfd
);
621 symbol_file_add_from_bfd
622 (abfd
, name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
), NULL
,
623 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
624 | OBJF_READNOW
| OBJF_USERLOADED
),
626 do_cleanups (cleanup
);
629 /* Read symbols from the vector of oso files.
631 Note that this function sorts OSO_VECTOR_PTR. */
634 macho_symfile_read_all_oso (VEC (oso_el
) **oso_vector_ptr
,
635 struct objfile
*main_objfile
,
636 symfile_add_flags symfile_flags
)
639 VEC (oso_el
) *vec
= *oso_vector_ptr
;
642 /* Sort oso by name so that files from libraries are gathered. */
643 qsort (VEC_address (oso_el
, vec
), VEC_length (oso_el
, vec
),
644 sizeof (oso_el
), oso_el_compare_name
);
646 for (ix
= 0; VEC_iterate (oso_el
, vec
, ix
, oso
);)
650 /* Check if this is a library name. */
651 pfx_len
= get_archive_prefix_len (oso
->name
);
660 std::string
archive_name (oso
->name
, pfx_len
);
662 /* Compute number of oso for this archive. */
664 VEC_iterate (oso_el
, vec
, last_ix
, oso2
); last_ix
++)
666 if (strncmp (oso2
->name
, archive_name
.c_str (), pfx_len
) != 0)
670 /* Open the archive and check the format. */
671 archive_bfd
= gdb_bfd_open (archive_name
.c_str (), gnutarget
, -1);
672 if (archive_bfd
== NULL
)
674 warning (_("Could not open OSO archive file \"%s\""),
675 archive_name
.c_str ());
679 if (!bfd_check_format (archive_bfd
, bfd_archive
))
681 warning (_("OSO archive file \"%s\" not an archive."),
682 archive_name
.c_str ());
683 gdb_bfd_unref (archive_bfd
);
688 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
, NULL
);
690 if (member_bfd
== NULL
)
692 warning (_("Could not read archive members out of "
693 "OSO archive \"%s\""), archive_name
.c_str ());
694 gdb_bfd_unref (archive_bfd
);
699 /* Load all oso in this library. */
700 while (member_bfd
!= NULL
)
703 const char *member_name
= member_bfd
->filename
;
704 int member_len
= strlen (member_name
);
706 /* If this member is referenced, add it as a symfile. */
707 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
709 oso2
= VEC_index (oso_el
, vec
, ix2
);
712 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
713 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
716 macho_add_oso_symfile (oso2
, member_bfd
,
717 bfd_get_filename (member_bfd
),
718 main_objfile
, symfile_flags
);
725 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
,
728 /* Free previous member if not referenced by an oso. */
730 gdb_bfd_unref (prev
);
732 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
734 oso_el
*oso2
= VEC_index (oso_el
, vec
, ix2
);
736 if (oso2
->name
!= NULL
)
737 warning (_("Could not find specified archive member "
738 "for OSO name \"%s\""), oso
->name
);
746 abfd
= gdb_bfd_open (oso
->name
, gnutarget
, -1);
748 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
749 bfd_errmsg (bfd_get_error ()));
751 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
759 /* DSYM (debug symbols) files contain the debug info of an executable.
760 This is a separate file created by dsymutil(1) and is similar to debug
762 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
763 executable name and the executable base name to get the DSYM file name. */
764 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
766 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
767 and return *FILENAMEP with its original xmalloc-ated filename.
768 Return NULL if no valid dsym file is found (FILENAMEP is not used in
772 macho_check_dsym (struct objfile
*objfile
, char **filenamep
)
774 size_t name_len
= strlen (objfile_name (objfile
));
775 size_t dsym_len
= strlen (DSYM_SUFFIX
);
776 const char *base_name
= lbasename (objfile_name (objfile
));
777 size_t base_len
= strlen (base_name
);
778 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
780 bfd_mach_o_load_command
*main_uuid
;
781 bfd_mach_o_load_command
*dsym_uuid
;
783 strcpy (dsym_filename
, objfile_name (objfile
));
784 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
785 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
787 if (access (dsym_filename
, R_OK
) != 0)
790 if (bfd_mach_o_lookup_command (objfile
->obfd
,
791 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
793 warning (_("can't find UUID in %s"), objfile_name (objfile
));
796 dsym_bfd
= gdb_bfd_openr (dsym_filename
, gnutarget
);
797 if (dsym_bfd
== NULL
)
799 warning (_("can't open dsym file %s"), dsym_filename
);
803 if (!bfd_check_format (dsym_bfd
, bfd_object
))
805 gdb_bfd_unref (dsym_bfd
);
806 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
810 if (bfd_mach_o_lookup_command (dsym_bfd
,
811 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
813 warning (_("can't find UUID in %s"), dsym_filename
);
814 gdb_bfd_unref (dsym_bfd
);
817 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
818 sizeof (main_uuid
->command
.uuid
.uuid
)))
820 warning (_("dsym file UUID doesn't match the one in %s"),
821 objfile_name (objfile
));
822 gdb_bfd_unref (dsym_bfd
);
825 *filenamep
= xstrdup (dsym_filename
);
830 macho_symfile_read (struct objfile
*objfile
, symfile_add_flags symfile_flags
)
832 bfd
*abfd
= objfile
->obfd
;
835 VEC (oso_el
) *oso_vector
= NULL
;
836 struct cleanup
*old_chain
= make_cleanup (VEC_cleanup (oso_el
), &oso_vector
);
838 /* Get symbols from the symbol table only if the file is an executable.
839 The symbol table of object files is not relocated and is expected to
840 be in the executable. */
841 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
845 /* Process the normal symbol table first. */
846 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
847 if (storage_needed
< 0)
848 error (_("Can't read symbols from %s: %s"),
849 bfd_get_filename (objfile
->obfd
),
850 bfd_errmsg (bfd_get_error ()));
852 if (storage_needed
> 0)
854 asymbol
**symbol_table
;
857 symbol_table
= (asymbol
**) xmalloc (storage_needed
);
858 make_cleanup (xfree
, symbol_table
);
860 minimal_symbol_reader
reader (objfile
);
862 symcount
= bfd_canonicalize_symtab (objfile
->obfd
, symbol_table
);
865 error (_("Can't read symbols from %s: %s"),
866 bfd_get_filename (objfile
->obfd
),
867 bfd_errmsg (bfd_get_error ()));
869 macho_symtab_read (reader
, objfile
, symcount
, symbol_table
,
875 /* Try to read .eh_frame / .debug_frame. */
876 /* First, locate these sections. We ignore the result status
877 as it only checks for debug info. */
878 dwarf2_has_info (objfile
, NULL
);
879 dwarf2_build_frame_info (objfile
);
881 /* Check for DSYM file. */
882 dsym_bfd
= macho_check_dsym (objfile
, &dsym_filename
);
883 if (dsym_bfd
!= NULL
)
885 struct bfd_section
*asect
, *dsect
;
887 make_cleanup (xfree
, dsym_filename
);
889 if (mach_o_debug_level
> 0)
890 printf_unfiltered (_("dsym file found\n"));
892 /* Set dsym section size. */
893 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
895 asect
= asect
->next
, dsect
= dsect
->next
)
897 if (strcmp (asect
->name
, dsect
->name
) != 0)
899 bfd_set_section_size (dsym_bfd
, dsect
,
900 bfd_get_section_size (asect
));
903 /* Add the dsym file as a separate file. */
904 make_cleanup_bfd_unref (dsym_bfd
);
905 symbol_file_add_separate (dsym_bfd
, dsym_filename
, symfile_flags
,
908 /* Don't try to read dwarf2 from main file or shared libraries. */
909 do_cleanups (old_chain
);
914 if (dwarf2_has_info (objfile
, NULL
))
916 /* DWARF 2 sections */
917 dwarf2_build_psymtabs (objfile
);
921 if (oso_vector
!= NULL
)
922 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
924 do_cleanups (old_chain
);
928 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
931 bfd
*abfd
= objfile
->obfd
;
933 /* We're only interested in sections with relocation
935 if ((sectp
->flags
& SEC_RELOC
) == 0)
938 if (mach_o_debug_level
> 0)
939 printf_unfiltered (_("Relocate section '%s' of %s\n"),
940 sectp
->name
, objfile_name (objfile
));
942 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
946 macho_symfile_finish (struct objfile
*objfile
)
951 macho_symfile_offsets (struct objfile
*objfile
,
952 const struct section_addr_info
*addrs
)
955 struct obj_section
*osect
;
957 /* Allocate section_offsets. */
958 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
959 objfile
->section_offsets
= (struct section_offsets
*)
960 obstack_alloc (&objfile
->objfile_obstack
,
961 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
962 memset (objfile
->section_offsets
, 0,
963 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
965 /* This code is run when we first add the objfile with
966 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
967 passed in. The place in symfile.c where the addrs are applied
968 depends on the addrs having section names. But in the dyld code
969 we build an anonymous array of addrs, so that code is a no-op.
970 Because of that, we have to apply the addrs to the sections here.
971 N.B. if an objfile slides after we've already created it, then it
972 goes through objfile_relocate. */
974 for (i
= 0; i
< addrs
->num_sections
; i
++)
976 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
978 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
980 if (strcmp (bfd_sect_name
, addrs
->other
[i
].name
) == 0)
982 obj_section_offset (osect
) = addrs
->other
[i
].addr
;
988 objfile
->sect_index_text
= 0;
990 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
992 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
993 int sect_index
= osect
- objfile
->sections
;;
995 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
997 if (strcmp (bfd_sect_name
, "__TEXT") == 0
998 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
999 objfile
->sect_index_text
= sect_index
;
1003 static const struct sym_fns macho_sym_fns
= {
1004 macho_new_init
, /* init anything gbl to entire symtab */
1005 macho_symfile_init
, /* read initial info, setup for sym_read() */
1006 macho_symfile_read
, /* read a symbol file into symtab */
1007 NULL
, /* sym_read_psymbols */
1008 macho_symfile_finish
, /* finished with file, cleanup */
1009 macho_symfile_offsets
, /* xlate external to internal form */
1010 default_symfile_segments
, /* Get segment information from a file. */
1012 macho_symfile_relocate
, /* Relocate a debug section. */
1013 NULL
, /* sym_get_probes */
1017 /* -Wmissing-prototypes */
1018 extern initialize_file_ftype _initialize_machoread
;
1021 _initialize_machoread (void)
1023 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
1025 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
1026 &mach_o_debug_level
,
1027 _("Set if printing Mach-O symbols processing."),
1028 _("Show if printing Mach-O symbols processing."),
1030 &setdebuglist
, &showdebuglist
);