1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2012 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"
36 #include "complaints.h"
41 /* If non-zero displays debugging message. */
42 static unsigned int mach_o_debug_level
= 0;
44 /* Dwarf debugging information are never in the final executable. They stay
45 in object files and the executable contains the list of object files read
47 Each time an oso (other source) is found in the executable, the reader
48 creates such a structure. They are read after the processing of the
53 /* Object file name. Can also be a member name. */
56 /* Associated time stamp. */
59 /* Stab symbols range for this OSO. */
63 /* Number of interesting stabs in the range. */
64 unsigned int nbr_syms
;
68 /* Vector of object files to be read after the executable. This is one
69 global variable but it's life-time is the one of macho_symfile_read. */
71 static VEC (oso_el
) *oso_vector
;
74 macho_new_init (struct objfile
*objfile
)
79 macho_symfile_init (struct objfile
*objfile
)
81 objfile
->flags
|= OBJF_REORDERED
;
82 init_entry_point_info (objfile
);
85 /* Add a new OSO to the vector of OSO to load. */
88 macho_register_oso (struct objfile
*objfile
,
89 asymbol
**oso_sym
, asymbol
**end_sym
,
90 unsigned int nbr_syms
)
94 el
.name
= (*oso_sym
)->name
;
95 el
.mtime
= (*oso_sym
)->value
;
98 el
.nbr_syms
= nbr_syms
;
99 VEC_safe_push (oso_el
, oso_vector
, &el
);
102 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
105 macho_symtab_add_minsym (struct objfile
*objfile
, const asymbol
*sym
)
107 if (sym
->name
== NULL
|| *sym
->name
== '\0')
109 /* Skip names that don't exist (shouldn't happen), or names
110 that are null strings (may happen). */
114 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
118 enum minimal_symbol_type ms_type
;
120 offset
= ANOFFSET (objfile
->section_offsets
, sym
->section
->index
);
122 /* Bfd symbols are section relative. */
123 symaddr
= sym
->value
+ sym
->section
->vma
;
125 /* Select global/local/weak symbols. Note that bfd puts abs
126 symbols in their own section, so all symbols we are
127 interested in will have a section. */
128 /* Relocate all non-absolute and non-TLS symbols by the
130 if (sym
->section
!= bfd_abs_section_ptr
131 && !(sym
->section
->flags
& SEC_THREAD_LOCAL
))
134 if (sym
->section
== bfd_abs_section_ptr
)
136 else if (sym
->section
->flags
& SEC_CODE
)
138 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
141 ms_type
= mst_file_text
;
143 else if (sym
->section
->flags
& SEC_ALLOC
)
145 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
147 if (sym
->section
->flags
& SEC_LOAD
)
152 else if (sym
->flags
& BSF_LOCAL
)
154 /* Not a special stabs-in-elf symbol, do regular
155 symbol processing. */
156 if (sym
->section
->flags
& SEC_LOAD
)
157 ms_type
= mst_file_data
;
159 ms_type
= mst_file_bss
;
162 ms_type
= mst_unknown
;
165 return; /* Skip this symbol. */
167 prim_record_minimal_symbol_and_info
168 (sym
->name
, symaddr
, ms_type
, sym
->section
->index
,
169 sym
->section
, objfile
);
173 /* Build the minimal symbol table from SYMBOL_TABLE of length
174 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
177 macho_symtab_read (struct objfile
*objfile
,
178 long number_of_symbols
, asymbol
**symbol_table
)
181 const asymbol
*dir_so
= NULL
;
182 const asymbol
*file_so
= NULL
;
183 asymbol
**oso_file
= NULL
;
184 unsigned int nbr_syms
= 0;
186 /* Current state while reading stabs. */
189 /* Not within an SO part. Only non-debugging symbols should be present,
190 and will be added to the minimal symbols table. */
193 /* First SO read. Introduce an SO section, and may be followed by a second
194 SO. The SO section should contain onl debugging symbols. */
197 /* Second non-null SO found, just after the first one. Means that the first
198 is in fact a directory name. */
201 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
207 for (i
= 0; i
< number_of_symbols
; i
++)
209 const asymbol
*sym
= symbol_table
[i
];
210 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
215 if (mach_o_sym
->n_type
== N_SO
)
217 /* Start of object stab. */
218 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
220 /* Unexpected empty N_SO. */
221 complaint (&symfile_complaints
,
222 _("Unexpected empty N_SO stab"));
231 else if (sym
->flags
& BSF_DEBUGGING
)
233 if (mach_o_sym
->n_type
== N_OPT
)
235 /* No complaint for OPT. */
239 /* Debugging symbols are not expected here. */
240 complaint (&symfile_complaints
,
241 _("%s: Unexpected debug stab outside SO markers"),
246 /* Non-debugging symbols go to the minimal symbol table. */
247 macho_symtab_add_minsym (objfile
, sym
);
253 if (mach_o_sym
->n_type
== N_SO
)
255 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
257 /* Unexpected empty N_SO. */
258 complaint (&symfile_complaints
, _("Empty SO section"));
261 else if (state
== S_FIRST_SO
)
263 /* Second SO stab for the file name. */
269 complaint (&symfile_complaints
, _("Three SO in a raw"));
271 else if (mach_o_sym
->n_type
== N_OSO
)
273 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
275 /* Empty OSO. Means that this file was compiled with
278 warning (_("stabs debugging not supported for %s"),
283 /* Non-empty OSO for a Dwarf file. */
284 oso_file
= symbol_table
+ i
;
286 state
= S_DWARF_FILE
;
290 complaint (&symfile_complaints
,
291 _("Unexpected stab after SO"));
296 if (mach_o_sym
->n_type
== N_SO
)
298 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
301 if (state
== S_DWARF_FILE
)
302 macho_register_oso (objfile
, oso_file
, symbol_table
+ i
,
308 complaint (&symfile_complaints
, _("Missing nul SO"));
314 else if (sym
->flags
& BSF_DEBUGGING
)
316 if (state
== S_STAB_FILE
)
318 /* FIXME: to be implemented. */
322 switch (mach_o_sym
->n_type
)
325 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
329 /* Interesting symbol. */
337 complaint (&symfile_complaints
,
338 _("unhandled stab for dwarf OSO file"));
344 complaint (&symfile_complaints
,
345 _("non-debugging symbol within SO"));
350 if (state
!= S_NO_SO
)
351 complaint (&symfile_complaints
, _("missing nul SO"));
354 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
355 returns the length of the archive name.
356 Returns -1 otherwise. */
359 get_archive_prefix_len (const char *name
)
362 int name_len
= strlen (name
);
364 if (name_len
== 0 || name
[name_len
- 1] != ')')
367 lparen
= strrchr (name
, '(');
368 if (lparen
== NULL
|| lparen
== name
)
370 return lparen
- name
;
373 /* Compare function to qsort OSOs, so that members of a library are
377 oso_el_compare_name (const void *vl
, const void *vr
)
379 const oso_el
*l
= (const oso_el
*)vl
;
380 const oso_el
*r
= (const oso_el
*)vr
;
382 return strcmp (l
->name
, r
->name
);
385 /* Hash table entry structure for the stabs symbols in the main object file.
386 This is used to speed up lookup for symbols in the OSO. */
388 struct macho_sym_hash_entry
390 struct bfd_hash_entry base
;
394 /* Routine to create an entry in the hash table. */
396 static struct bfd_hash_entry
*
397 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
398 struct bfd_hash_table
*table
,
401 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
403 /* Allocate the structure if it has not already been allocated by a
406 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
411 /* Call the allocation method of the superclass. */
412 ret
= (struct macho_sym_hash_entry
*)
413 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
417 /* Initialize the local fields. */
421 return (struct bfd_hash_entry
*) ret
;
424 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
425 to get the value of global and common symbols. */
428 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
430 /* For common symbol and global symbols, use the min symtab. */
431 struct minimal_symbol
*msym
;
432 const char *name
= sym
->name
;
434 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
436 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
439 warning (_("can't find symbol '%s' in minsymtab"), name
);
443 return SYMBOL_VALUE_ADDRESS (msym
);
446 /* Add oso file OSO/ABFD as a symbol file. */
449 macho_add_oso_symfile (oso_el
*oso
, bfd
*abfd
,
450 struct objfile
*main_objfile
, int symfile_flags
)
454 asymbol
**symbol_table
;
456 struct bfd_hash_table table
;
458 struct cleanup
*cleanup
;
460 /* Per section flag to mark which section have been rebased. */
461 unsigned char *sections_rebased
;
463 if (mach_o_debug_level
> 0)
465 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
467 if (!bfd_check_format (abfd
, bfd_object
))
469 warning (_("`%s': can't read symbols: %s."), oso
->name
,
470 bfd_errmsg (bfd_get_error ()));
471 gdb_bfd_unref (abfd
);
475 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
))
477 warning (_("`%s': file time stamp mismatch."), oso
->name
);
478 gdb_bfd_unref (abfd
);
482 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
483 sizeof (struct macho_sym_hash_entry
),
486 warning (_("`%s': can't create hash table"), oso
->name
);
487 gdb_bfd_unref (abfd
);
491 bfd_set_cacheable (abfd
, 1);
493 /* Read symbols table. */
494 storage
= bfd_get_symtab_upper_bound (abfd
);
495 symbol_table
= (asymbol
**) xmalloc (storage
);
496 bfd_canonicalize_symtab (abfd
, symbol_table
);
498 /* Init section flags. */
499 nbr_sections
= bfd_count_sections (abfd
);
500 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
501 for (i
= 0; i
< nbr_sections
; i
++)
502 sections_rebased
[i
] = 0;
504 /* Put symbols for the OSO file in the hash table. */
505 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
507 const asymbol
*sym
= *symp
;
508 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
510 switch (mach_o_sym
->n_type
)
518 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
529 struct macho_sym_hash_entry
*ent
;
531 ent
= (struct macho_sym_hash_entry
*)
532 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
533 if (ent
->sym
!= NULL
)
534 complaint (&symfile_complaints
,
535 _("Duplicated symbol %s in symbol table"), sym
->name
);
538 if (mach_o_debug_level
> 4)
540 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
542 (_("Adding symbol %s (addr: %s)\n"),
543 sym
->name
, paddress (arch
, sym
->value
));
550 /* Relocate symbols of the OSO. */
551 for (i
= 0; symbol_table
[i
]; i
++)
553 asymbol
*sym
= symbol_table
[i
];
554 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
556 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
558 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
561 /* For common symbol use the min symtab and modify the OSO
565 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
568 sym
->section
= bfd_com_section_ptr
;
572 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
575 asection
*sec
= sym
->section
;
576 bfd_mach_o_section
*msec
;
577 unsigned int sec_type
;
579 /* Skip buggy ones. */
580 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
583 /* Only consider regular, non-debugging sections. */
584 msec
= bfd_mach_o_get_mach_o_section (sec
);
585 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
586 if ((sec_type
== BFD_MACH_O_S_REGULAR
587 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
588 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
592 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
594 /* Use the min symtab for global symbols. */
595 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
599 struct macho_sym_hash_entry
*ent
;
601 ent
= (struct macho_sym_hash_entry
*)
602 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
604 addr
= bfd_asymbol_value (ent
->sym
);
607 /* Adjust the section. */
610 CORE_ADDR res
= addr
- sym
->value
;
612 if (mach_o_debug_level
> 3)
614 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
616 (_("resolve sect %s with %s (set to %s)\n"),
617 sec
->name
, sym
->name
,
618 paddress (arch
, res
));
620 bfd_set_section_vma (abfd
, sec
, res
);
621 sections_rebased
[sec
->index
] = 1;
626 /* Mark the section as never rebased. */
627 sections_rebased
[sec
->index
] = 2;
632 bfd_hash_table_free (&table
);
634 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
635 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
636 cleanup
= make_cleanup_bfd_unref (abfd
);
637 symbol_file_add_from_bfd
638 (abfd
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
), NULL
,
639 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
640 | OBJF_READNOW
| OBJF_USERLOADED
),
642 do_cleanups (cleanup
);
645 /* Read symbols from the vector of oso files. */
648 macho_symfile_read_all_oso (struct objfile
*main_objfile
, int symfile_flags
)
653 struct cleanup
*cleanup
= make_cleanup (null_cleanup
, NULL
);
658 /* Sort oso by name so that files from libraries are gathered. */
659 qsort (VEC_address (oso_el
, vec
), VEC_length (oso_el
, vec
),
660 sizeof (oso_el
), oso_el_compare_name
);
662 for (ix
= 0; VEC_iterate (oso_el
, vec
, ix
, oso
);)
666 /* Check if this is a library name. */
667 pfx_len
= get_archive_prefix_len (oso
->name
);
672 char *archive_name
= XNEWVEC (char, pfx_len
+ 1);
677 memcpy (archive_name
, oso
->name
, pfx_len
);
678 archive_name
[pfx_len
] = '\0';
680 make_cleanup (xfree
, archive_name
);
682 /* Compute number of oso for this archive. */
684 VEC_iterate (oso_el
, vec
, last_ix
, oso2
); last_ix
++)
686 if (strncmp (oso2
->name
, archive_name
, pfx_len
) != 0)
690 /* Open the archive and check the format. */
691 archive_bfd
= gdb_bfd_openr (archive_name
, gnutarget
);
692 if (archive_bfd
== NULL
)
694 warning (_("Could not open OSO archive file \"%s\""),
699 if (!bfd_check_format (archive_bfd
, bfd_archive
))
701 warning (_("OSO archive file \"%s\" not an archive."),
703 gdb_bfd_unref (archive_bfd
);
708 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
, NULL
);
710 if (member_bfd
== NULL
)
712 warning (_("Could not read archive members out of "
713 "OSO archive \"%s\""), archive_name
);
714 gdb_bfd_unref (archive_bfd
);
719 /* Load all oso in this library. */
720 while (member_bfd
!= NULL
)
723 const char *member_name
= member_bfd
->filename
;
724 int member_len
= strlen (member_name
);
726 /* If this member is referenced, add it as a symfile. */
727 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
729 oso2
= VEC_index (oso_el
, vec
, ix2
);
732 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
733 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
736 macho_add_oso_symfile (oso2
, member_bfd
,
737 main_objfile
, symfile_flags
);
744 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
,
747 /* Free previous member if not referenced by an oso. */
749 gdb_bfd_unref (prev
);
751 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
753 oso_el
*oso2
= VEC_index (oso_el
, vec
, ix2
);
755 if (oso2
->name
!= NULL
)
756 warning (_("Could not find specified archive member "
757 "for OSO name \"%s\""), oso
->name
);
765 abfd
= gdb_bfd_openr (oso
->name
, gnutarget
);
767 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
768 bfd_errmsg (bfd_get_error ()));
770 macho_add_oso_symfile (oso
, abfd
, main_objfile
, symfile_flags
);
776 VEC_free (oso_el
, vec
);
777 do_cleanups (cleanup
);
780 /* DSYM (debug symbols) files contain the debug info of an executable.
781 This is a separate file created by dsymutil(1) and is similar to debug
783 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
784 executable name and the executable base name to get the DSYM file name. */
785 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
787 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
788 Return NULL if no valid dsym file is found. */
791 macho_check_dsym (struct objfile
*objfile
)
793 size_t name_len
= strlen (objfile
->name
);
794 size_t dsym_len
= strlen (DSYM_SUFFIX
);
795 const char *base_name
= lbasename (objfile
->name
);
796 size_t base_len
= strlen (base_name
);
797 char *dsym_filename
= alloca (name_len
+ dsym_len
+ base_len
+ 1);
799 bfd_mach_o_load_command
*main_uuid
;
800 bfd_mach_o_load_command
*dsym_uuid
;
802 strcpy (dsym_filename
, objfile
->name
);
803 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
804 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
806 if (access (dsym_filename
, R_OK
) != 0)
809 if (bfd_mach_o_lookup_command (objfile
->obfd
,
810 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
812 warning (_("can't find UUID in %s"), objfile
->name
);
815 dsym_bfd
= gdb_bfd_openr (dsym_filename
, gnutarget
);
816 if (dsym_bfd
== NULL
)
818 warning (_("can't open dsym file %s"), dsym_filename
);
822 if (!bfd_check_format (dsym_bfd
, bfd_object
))
824 gdb_bfd_unref (dsym_bfd
);
825 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
829 if (bfd_mach_o_lookup_command (dsym_bfd
,
830 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
832 warning (_("can't find UUID in %s"), dsym_filename
);
833 gdb_bfd_unref (dsym_bfd
);
836 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
837 sizeof (main_uuid
->command
.uuid
.uuid
)))
839 warning (_("dsym file UUID doesn't match the one in %s"), objfile
->name
);
840 gdb_bfd_unref (dsym_bfd
);
847 macho_symfile_read (struct objfile
*objfile
, int symfile_flags
)
849 bfd
*abfd
= objfile
->obfd
;
854 /* Get symbols from the symbol table only if the file is an executable.
855 The symbol table of object files is not relocated and is expected to
856 be in the executable. */
857 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
859 /* Process the normal symbol table first. */
860 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
861 if (storage_needed
< 0)
862 error (_("Can't read symbols from %s: %s"),
863 bfd_get_filename (objfile
->obfd
),
864 bfd_errmsg (bfd_get_error ()));
866 if (storage_needed
> 0)
868 asymbol
**symbol_table
;
870 struct cleanup
*back_to
;
872 symbol_table
= (asymbol
**) xmalloc (storage_needed
);
873 make_cleanup (xfree
, symbol_table
);
875 init_minimal_symbol_collection ();
876 back_to
= make_cleanup_discard_minimal_symbols ();
878 symcount
= bfd_canonicalize_symtab (objfile
->obfd
, symbol_table
);
881 error (_("Can't read symbols from %s: %s"),
882 bfd_get_filename (objfile
->obfd
),
883 bfd_errmsg (bfd_get_error ()));
885 macho_symtab_read (objfile
, symcount
, symbol_table
);
887 install_minimal_symbols (objfile
);
888 do_cleanups (back_to
);
891 /* Try to read .eh_frame / .debug_frame. */
892 /* First, locate these sections. We ignore the result status
893 as it only checks for debug info. */
894 dwarf2_has_info (objfile
, NULL
);
895 dwarf2_build_frame_info (objfile
);
897 /* Check for DSYM file. */
898 dsym_bfd
= macho_check_dsym (objfile
);
899 if (dsym_bfd
!= NULL
)
903 struct bfd_section
*asect
, *dsect
;
904 struct cleanup
*cleanup
;
906 if (mach_o_debug_level
> 0)
907 printf_unfiltered (_("dsym file found\n"));
909 /* Remove oso. They won't be used. */
910 VEC_free (oso_el
, oso_vector
);
913 /* Set dsym section size. */
914 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
916 asect
= asect
->next
, dsect
= dsect
->next
)
918 if (strcmp (asect
->name
, dsect
->name
) != 0)
920 bfd_set_section_size (dsym_bfd
, dsect
,
921 bfd_get_section_size (asect
));
924 /* Add the dsym file as a separate file. */
925 cleanup
= make_cleanup_bfd_unref (dsym_bfd
);
926 symbol_file_add_separate (dsym_bfd
, symfile_flags
, objfile
);
927 do_cleanups (cleanup
);
929 /* Don't try to read dwarf2 from main file or shared libraries. */
934 if (dwarf2_has_info (objfile
, NULL
))
936 /* DWARF 2 sections */
937 dwarf2_build_psymtabs (objfile
);
941 if (oso_vector
!= NULL
)
942 macho_symfile_read_all_oso (objfile
, symfile_flags
);
946 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
949 bfd
*abfd
= objfile
->obfd
;
951 /* We're only interested in sections with relocation
953 if ((sectp
->flags
& SEC_RELOC
) == 0)
956 if (mach_o_debug_level
> 0)
957 printf_unfiltered (_("Relocate section '%s' of %s\n"),
958 sectp
->name
, objfile
->name
);
960 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
964 macho_symfile_finish (struct objfile
*objfile
)
969 macho_symfile_offsets (struct objfile
*objfile
,
970 struct section_addr_info
*addrs
)
973 unsigned int num_sections
;
974 struct obj_section
*osect
;
976 /* Allocate section_offsets. */
977 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
978 objfile
->section_offsets
= (struct section_offsets
*)
979 obstack_alloc (&objfile
->objfile_obstack
,
980 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
981 memset (objfile
->section_offsets
, 0,
982 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
984 /* This code is run when we first add the objfile with
985 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
986 passed in. The place in symfile.c where the addrs are applied
987 depends on the addrs having section names. But in the dyld code
988 we build an anonymous array of addrs, so that code is a no-op.
989 Because of that, we have to apply the addrs to the sections here.
990 N.B. if an objfile slides after we've already created it, then it
991 goes through objfile_relocate. */
993 for (i
= 0; i
< addrs
->num_sections
; i
++)
995 if (addrs
->other
[i
].name
== NULL
)
998 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
1000 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
1002 if (strcmp (bfd_sect_name
, addrs
->other
[i
].name
) == 0)
1004 obj_section_offset (osect
) = addrs
->other
[i
].addr
;
1010 objfile
->sect_index_text
= 0;
1012 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
1014 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
1015 int sect_index
= osect
->the_bfd_section
->index
;
1017 if (strncmp (bfd_sect_name
, "LC_SEGMENT.", 11) == 0)
1018 bfd_sect_name
+= 11;
1019 if (strcmp (bfd_sect_name
, "__TEXT") == 0
1020 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
1021 objfile
->sect_index_text
= sect_index
;
1025 static const struct sym_fns macho_sym_fns
= {
1026 bfd_target_mach_o_flavour
,
1028 macho_new_init
, /* init anything gbl to entire symtab */
1029 macho_symfile_init
, /* read initial info, setup for sym_read() */
1030 macho_symfile_read
, /* read a symbol file into symtab */
1031 NULL
, /* sym_read_psymbols */
1032 macho_symfile_finish
, /* finished with file, cleanup */
1033 macho_symfile_offsets
, /* xlate external to internal form */
1034 default_symfile_segments
, /* Get segment information from a file. */
1036 macho_symfile_relocate
, /* Relocate a debug section. */
1037 NULL
, /* sym_get_probes */
1041 /* -Wmissing-prototypes */
1042 extern initialize_file_ftype _initialize_machoread
;
1045 _initialize_machoread ()
1047 add_symtab_fns (&macho_sym_fns
);
1049 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
1050 &mach_o_debug_level
,
1051 _("Set if printing Mach-O symbols processing."),
1052 _("Show if printing Mach-O symbols processing."),
1054 &setdebuglist
, &showdebuglist
);