1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008, 2009, 2010, 2011 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"
40 /* If non-zero displays debugging message. */
41 static int mach_o_debug_level
= 0;
43 /* Dwarf debugging information are never in the final executable. They stay
44 in object files and the executable contains the list of object files read
46 Each time an oso (other source) is found in the executable, the reader
47 creates such a structure. They are read after the processing of the
52 /* Object file name. Can also be a member name. */
55 /* Associated time stamp. */
58 /* Stab symbols range for this OSO. */
62 /* Number of interesting stabs in the range. */
63 unsigned int nbr_syms
;
67 /* Vector of object files to be read after the executable. This is one
68 global variable but it's life-time is the one of macho_symfile_read. */
70 static VEC (oso_el
) *oso_vector
;
73 macho_new_init (struct objfile
*objfile
)
78 macho_symfile_init (struct objfile
*objfile
)
80 objfile
->flags
|= OBJF_REORDERED
;
81 init_entry_point_info (objfile
);
84 /* Add a new OSO to the vector of OSO to load. */
87 macho_register_oso (struct objfile
*objfile
,
88 asymbol
**oso_sym
, asymbol
**end_sym
,
89 unsigned int nbr_syms
)
93 el
.name
= (*oso_sym
)->name
;
94 el
.mtime
= (*oso_sym
)->value
;
97 el
.nbr_syms
= nbr_syms
;
98 VEC_safe_push (oso_el
, oso_vector
, &el
);
101 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
104 macho_symtab_add_minsym (struct objfile
*objfile
, const asymbol
*sym
)
106 if (sym
->name
== NULL
|| *sym
->name
== '\0')
108 /* Skip names that don't exist (shouldn't happen), or names
109 that are null strings (may happen). */
113 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
117 enum minimal_symbol_type ms_type
;
119 offset
= ANOFFSET (objfile
->section_offsets
, sym
->section
->index
);
121 /* Bfd symbols are section relative. */
122 symaddr
= sym
->value
+ sym
->section
->vma
;
124 /* Select global/local/weak symbols. Note that bfd puts abs
125 symbols in their own section, so all symbols we are
126 interested in will have a section. */
127 /* Relocate all non-absolute and non-TLS symbols by the
129 if (sym
->section
!= &bfd_abs_section
130 && !(sym
->section
->flags
& SEC_THREAD_LOCAL
))
133 if (sym
->section
== &bfd_abs_section
)
135 else if (sym
->section
->flags
& SEC_CODE
)
137 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
140 ms_type
= mst_file_text
;
142 else if (sym
->section
->flags
& SEC_ALLOC
)
144 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
146 if (sym
->section
->flags
& SEC_LOAD
)
151 else if (sym
->flags
& BSF_LOCAL
)
153 /* Not a special stabs-in-elf symbol, do regular
154 symbol processing. */
155 if (sym
->section
->flags
& SEC_LOAD
)
156 ms_type
= mst_file_data
;
158 ms_type
= mst_file_bss
;
161 ms_type
= mst_unknown
;
164 return; /* Skip this symbol. */
166 prim_record_minimal_symbol_and_info
167 (sym
->name
, symaddr
, ms_type
, sym
->section
->index
,
168 sym
->section
, objfile
);
172 /* Build the minimal symbol table from SYMBOL_TABLE of length
173 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
176 macho_symtab_read (struct objfile
*objfile
,
177 long number_of_symbols
, asymbol
**symbol_table
)
180 const asymbol
*dir_so
= NULL
;
181 const asymbol
*file_so
= NULL
;
182 asymbol
**oso_file
= NULL
;
183 unsigned int nbr_syms
;
185 /* Current state while reading stabs. */
188 /* Not within an SO part. Only non-debugging symbols should be present,
189 and will be added to the minimal symbols table. */
192 /* First SO read. Introduce an SO section, and may be followed by a second
193 SO. The SO section should contain onl debugging symbols. */
196 /* Second non-null SO found, just after the first one. Means that the first
197 is in fact a directory name. */
200 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
206 for (i
= 0; i
< number_of_symbols
; i
++)
208 const asymbol
*sym
= symbol_table
[i
];
209 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
214 if (mach_o_sym
->n_type
== N_SO
)
216 /* Start of object stab. */
217 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
219 /* Unexpected empty N_SO. */
220 complaint (&symfile_complaints
,
221 _("Unexpected empty N_SO stab"));
230 else if (sym
->flags
& BSF_DEBUGGING
)
232 /* Debugging symbols are not expected here. */
233 complaint (&symfile_complaints
,
234 _("Unexpected debug stab outside SO markers"));
238 /* Non-debugging symbols go to the minimal symbol table. */
239 macho_symtab_add_minsym (objfile
, sym
);
245 if (mach_o_sym
->n_type
== N_SO
)
247 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
249 /* Unexpected empty N_SO. */
250 complaint (&symfile_complaints
, _("Empty SO section"));
253 else if (state
== S_FIRST_SO
)
255 /* Second SO stab for the file name. */
261 complaint (&symfile_complaints
, _("Three SO in a raw"));
263 else if (mach_o_sym
->n_type
== N_OSO
)
265 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
267 /* Empty OSO. Means that this file was compiled with
270 warning (_("stabs debugging not supported for %s"),
275 /* Non-empty OSO for a Dwarf file. */
276 oso_file
= symbol_table
+ i
;
278 state
= S_DWARF_FILE
;
282 complaint (&symfile_complaints
,
283 _("Unexpected stab after SO"));
288 if (mach_o_sym
->n_type
== N_SO
)
290 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
293 if (state
== S_DWARF_FILE
)
294 macho_register_oso (objfile
, oso_file
, symbol_table
+ i
,
300 complaint (&symfile_complaints
, _("Missing nul SO"));
306 else if (sym
->flags
& BSF_DEBUGGING
)
308 if (state
== S_STAB_FILE
)
310 /* FIXME: to be implemented. */
314 switch (mach_o_sym
->n_type
)
317 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
321 /* Interesting symbol. */
329 complaint (&symfile_complaints
,
330 _("unhandled stab for dwarf OSO file"));
336 complaint (&symfile_complaints
,
337 _("non-debugging symbol within SO"));
342 if (state
!= S_NO_SO
)
343 complaint (&symfile_complaints
, _("missing nul SO"));
346 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
347 returns the length of the archive name.
348 Returns -1 otherwise. */
351 get_archive_prefix_len (const char *name
)
354 int name_len
= strlen (name
);
356 if (name_len
== 0 || name
[name_len
- 1] != ')')
359 lparen
= strrchr (name
, '(');
360 if (lparen
== NULL
|| lparen
== name
)
362 return lparen
- name
;
365 /* Compare function to qsort OSOs, so that members of a library are
369 oso_el_compare_name (const void *vl
, const void *vr
)
371 const oso_el
*l
= (const oso_el
*)vl
;
372 const oso_el
*r
= (const oso_el
*)vr
;
374 return strcmp (l
->name
, r
->name
);
377 /* Hash table entry structure for the stabs symbols in the main object file.
378 This is used to speed up lookup for symbols in the OSO. */
380 struct macho_sym_hash_entry
382 struct bfd_hash_entry base
;
386 /* Routine to create an entry in the hash table. */
388 static struct bfd_hash_entry
*
389 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
390 struct bfd_hash_table
*table
,
393 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
395 /* Allocate the structure if it has not already been allocated by a
398 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
403 /* Call the allocation method of the superclass. */
404 ret
= (struct macho_sym_hash_entry
*)
405 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
409 /* Initialize the local fields. */
413 return (struct bfd_hash_entry
*) ret
;
416 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
417 to get the value of global and common symbols. */
420 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
422 /* For common symbol and global symbols, use the min symtab. */
423 struct minimal_symbol
*msym
;
424 const char *name
= sym
->name
;
426 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
428 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
431 warning (_("can't find symbol '%s' in minsymtab"), name
);
435 return SYMBOL_VALUE_ADDRESS (msym
);
438 /* Add oso file OSO/ABFD as a symbol file. */
441 macho_add_oso_symfile (oso_el
*oso
, bfd
*abfd
,
442 struct objfile
*main_objfile
, int symfile_flags
)
446 asymbol
**symbol_table
;
448 struct bfd_hash_table table
;
451 /* Per section flag to mark which section have been rebased. */
452 unsigned char *sections_rebased
;
454 if (mach_o_debug_level
> 0)
456 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
458 if (!bfd_check_format (abfd
, bfd_object
))
460 warning (_("`%s': can't read symbols: %s."), oso
->name
,
461 bfd_errmsg (bfd_get_error ()));
466 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
))
468 warning (_("`%s': file time stamp mismatch."), oso
->name
);
473 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
474 sizeof (struct macho_sym_hash_entry
),
477 warning (_("`%s': can't create hash table"), oso
->name
);
482 bfd_set_cacheable (abfd
, 1);
484 /* Read symbols table. */
485 storage
= bfd_get_symtab_upper_bound (abfd
);
486 symbol_table
= (asymbol
**) xmalloc (storage
);
487 bfd_canonicalize_symtab (abfd
, symbol_table
);
489 /* Init section flags. */
490 nbr_sections
= bfd_count_sections (abfd
);
491 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
492 for (i
= 0; i
< nbr_sections
; i
++)
493 sections_rebased
[i
] = 0;
495 /* Put symbols for the OSO file in the hash table. */
496 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
498 const asymbol
*sym
= *symp
;
499 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
501 switch (mach_o_sym
->n_type
)
509 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
520 struct macho_sym_hash_entry
*ent
;
522 ent
= (struct macho_sym_hash_entry
*)
523 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
524 if (ent
->sym
!= NULL
)
525 complaint (&symfile_complaints
,
526 _("Duplicated symbol %s in symbol table"), sym
->name
);
529 if (mach_o_debug_level
> 4)
531 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
533 (_("Adding symbol %s (addr: %s)\n"),
534 sym
->name
, paddress (arch
, sym
->value
));
541 /* Relocate symbols of the OSO. */
542 for (i
= 0; symbol_table
[i
]; i
++)
544 asymbol
*sym
= symbol_table
[i
];
545 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
547 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
549 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
552 /* For common symbol use the min symtab and modify the OSO
556 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
559 sym
->section
= &bfd_com_section
;
563 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
566 asection
*sec
= sym
->section
;
567 bfd_mach_o_section
*msec
;
568 unsigned int sec_type
;
570 /* Skip buggy ones. */
571 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
574 /* Only consider regular, non-debugging sections. */
575 msec
= bfd_mach_o_get_mach_o_section (sec
);
576 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
577 if ((sec_type
== BFD_MACH_O_S_REGULAR
578 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
579 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
583 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
585 /* Use the min symtab for global symbols. */
586 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
590 struct macho_sym_hash_entry
*ent
;
592 ent
= (struct macho_sym_hash_entry
*)
593 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
595 addr
= bfd_asymbol_value (ent
->sym
);
598 /* Adjust the section. */
601 CORE_ADDR res
= addr
- sym
->value
;
603 if (mach_o_debug_level
> 3)
605 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
607 (_("resolve sect %s with %s (set to %s)\n"),
608 sec
->name
, sym
->name
,
609 paddress (arch
, res
));
611 bfd_set_section_vma (abfd
, sec
, res
);
612 sections_rebased
[sec
->index
] = 1;
617 /* Mark the section as never rebased. */
618 sections_rebased
[sec
->index
] = 2;
623 bfd_hash_table_free (&table
);
625 /* Make sure that the filename was malloc'ed. The current filename comes
626 either from an OSO symbol name or from an archive name. Memory for both
627 is not managed by gdb. */
628 abfd
->filename
= xstrdup (abfd
->filename
);
630 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
631 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
632 symbol_file_add_from_bfd
633 (abfd
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
), NULL
,
634 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
635 | OBJF_READNOW
| OBJF_USERLOADED
),
639 /* Read symbols from the vector of oso files. */
642 macho_symfile_read_all_oso (struct objfile
*main_objfile
, int symfile_flags
)
651 /* Sort oso by name so that files from libraries are gathered. */
652 qsort (VEC_address (oso_el
, vec
), VEC_length (oso_el
, vec
),
653 sizeof (oso_el
), oso_el_compare_name
);
655 for (ix
= 0; VEC_iterate (oso_el
, vec
, ix
, oso
);)
659 /* Check if this is a library name. */
660 pfx_len
= get_archive_prefix_len (oso
->name
);
665 char *archive_name
= XNEWVEC (char, pfx_len
+ 1);
670 memcpy (archive_name
, oso
->name
, pfx_len
);
671 archive_name
[pfx_len
] = '\0';
673 /* Compute number of oso for this archive. */
675 VEC_iterate (oso_el
, vec
, last_ix
, oso2
); last_ix
++)
677 if (strncmp (oso2
->name
, archive_name
, pfx_len
) != 0)
681 /* Open the archive and check the format. */
682 archive_bfd
= bfd_openr (archive_name
, gnutarget
);
683 if (archive_bfd
== NULL
)
685 warning (_("Could not open OSO archive file \"%s\""),
690 if (!bfd_check_format (archive_bfd
, bfd_archive
))
692 warning (_("OSO archive file \"%s\" not an archive."),
694 bfd_close (archive_bfd
);
698 member_bfd
= bfd_openr_next_archived_file (archive_bfd
, NULL
);
700 if (member_bfd
== NULL
)
702 warning (_("Could not read archive members out of "
703 "OSO archive \"%s\""), archive_name
);
704 bfd_close (archive_bfd
);
709 /* Load all oso in this library. */
710 while (member_bfd
!= NULL
)
713 const char *member_name
= member_bfd
->filename
;
714 int member_len
= strlen (member_name
);
716 /* If this member is referenced, add it as a symfile. */
717 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
719 oso2
= VEC_index (oso_el
, vec
, ix2
);
722 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
723 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
726 macho_add_oso_symfile (oso2
, member_bfd
,
727 main_objfile
, symfile_flags
);
734 member_bfd
= bfd_openr_next_archived_file
735 (archive_bfd
, member_bfd
);
737 /* Free previous member if not referenced by an oso. */
741 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
743 oso_el
*oso2
= VEC_index (oso_el
, vec
, ix2
);
745 if (oso2
->name
!= NULL
)
746 warning (_("Could not find specified archive member "
747 "for OSO name \"%s\""), oso
->name
);
755 abfd
= bfd_openr (oso
->name
, gnutarget
);
757 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
758 bfd_errmsg (bfd_get_error ()));
760 macho_add_oso_symfile (oso
, abfd
, main_objfile
, symfile_flags
);
766 VEC_free (oso_el
, vec
);
769 /* DSYM (debug symbols) files contain the debug info of an executable.
770 This is a separate file created by dsymutil(1) and is similar to debug
772 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
773 executable name and the executable base name to get the DSYM file name. */
774 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
776 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
777 Return NULL if no valid dsym file is found. */
780 macho_check_dsym (struct objfile
*objfile
)
782 size_t name_len
= strlen (objfile
->name
);
783 size_t dsym_len
= strlen (DSYM_SUFFIX
);
784 const char *base_name
= lbasename (objfile
->name
);
785 size_t base_len
= strlen (base_name
);
786 char *dsym_filename
= alloca (name_len
+ dsym_len
+ base_len
+ 1);
788 bfd_mach_o_load_command
*main_uuid
;
789 bfd_mach_o_load_command
*dsym_uuid
;
791 strcpy (dsym_filename
, objfile
->name
);
792 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
793 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
795 if (access (dsym_filename
, R_OK
) != 0)
798 if (bfd_mach_o_lookup_command (objfile
->obfd
,
799 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
801 warning (_("can't find UUID in %s"), objfile
->name
);
804 dsym_filename
= xstrdup (dsym_filename
);
805 dsym_bfd
= bfd_openr (dsym_filename
, gnutarget
);
806 if (dsym_bfd
== NULL
)
808 warning (_("can't open dsym file %s"), dsym_filename
);
809 xfree (dsym_filename
);
813 if (!bfd_check_format (dsym_bfd
, bfd_object
))
815 bfd_close (dsym_bfd
);
816 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
817 xfree (dsym_filename
);
821 if (bfd_mach_o_lookup_command (dsym_bfd
,
822 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
824 warning (_("can't find UUID in %s"), dsym_filename
);
825 bfd_close (dsym_bfd
);
826 xfree (dsym_filename
);
829 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
830 sizeof (main_uuid
->command
.uuid
.uuid
)))
832 warning (_("dsym file UUID doesn't match the one in %s"), objfile
->name
);
833 bfd_close (dsym_bfd
);
834 xfree (dsym_filename
);
841 macho_symfile_read (struct objfile
*objfile
, int symfile_flags
)
843 bfd
*abfd
= objfile
->obfd
;
848 /* Get symbols from the symbol table only if the file is an executable.
849 The symbol table of object files is not relocated and is expected to
850 be in the executable. */
851 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
853 /* Process the normal symbol table first. */
854 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
855 if (storage_needed
< 0)
856 error (_("Can't read symbols from %s: %s"),
857 bfd_get_filename (objfile
->obfd
),
858 bfd_errmsg (bfd_get_error ()));
860 if (storage_needed
> 0)
862 asymbol
**symbol_table
;
864 struct cleanup
*back_to
;
866 symbol_table
= (asymbol
**) xmalloc (storage_needed
);
867 make_cleanup (xfree
, symbol_table
);
869 init_minimal_symbol_collection ();
870 back_to
= make_cleanup_discard_minimal_symbols ();
872 symcount
= bfd_canonicalize_symtab (objfile
->obfd
, symbol_table
);
875 error (_("Can't read symbols from %s: %s"),
876 bfd_get_filename (objfile
->obfd
),
877 bfd_errmsg (bfd_get_error ()));
879 macho_symtab_read (objfile
, symcount
, symbol_table
);
881 install_minimal_symbols (objfile
);
882 do_cleanups (back_to
);
885 /* Try to read .eh_frame / .debug_frame. */
886 /* First, locate these sections. We ignore the result status
887 as it only checks for debug info. */
888 dwarf2_has_info (objfile
, NULL
);
889 dwarf2_build_frame_info (objfile
);
891 /* Check for DSYM file. */
892 dsym_bfd
= macho_check_dsym (objfile
);
893 if (dsym_bfd
!= NULL
)
897 struct bfd_section
*asect
, *dsect
;
899 if (mach_o_debug_level
> 0)
900 printf_unfiltered (_("dsym file found\n"));
902 /* Remove oso. They won't be used. */
903 VEC_free (oso_el
, oso_vector
);
906 /* Set dsym section size. */
907 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
909 asect
= asect
->next
, dsect
= dsect
->next
)
911 if (strcmp (asect
->name
, dsect
->name
) != 0)
913 bfd_set_section_size (dsym_bfd
, dsect
,
914 bfd_get_section_size (asect
));
917 /* Add the dsym file as a separate file. */
918 symbol_file_add_separate (dsym_bfd
, symfile_flags
, objfile
);
920 /* Don't try to read dwarf2 from main file or shared libraries. */
925 if (dwarf2_has_info (objfile
, NULL
))
927 /* DWARF 2 sections */
928 dwarf2_build_psymtabs (objfile
);
932 if (oso_vector
!= NULL
)
933 macho_symfile_read_all_oso (objfile
, symfile_flags
);
937 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
940 bfd
*abfd
= objfile
->obfd
;
942 /* We're only interested in sections with relocation
944 if ((sectp
->flags
& SEC_RELOC
) == 0)
947 if (mach_o_debug_level
> 0)
948 printf_unfiltered (_("Relocate section '%s' of %s\n"),
949 sectp
->name
, objfile
->name
);
951 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
955 macho_symfile_finish (struct objfile
*objfile
)
960 macho_symfile_offsets (struct objfile
*objfile
,
961 struct section_addr_info
*addrs
)
964 unsigned int num_sections
;
965 struct obj_section
*osect
;
967 /* Allocate section_offsets. */
968 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
969 objfile
->section_offsets
= (struct section_offsets
*)
970 obstack_alloc (&objfile
->objfile_obstack
,
971 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
972 memset (objfile
->section_offsets
, 0,
973 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
975 /* This code is run when we first add the objfile with
976 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
977 passed in. The place in symfile.c where the addrs are applied
978 depends on the addrs having section names. But in the dyld code
979 we build an anonymous array of addrs, so that code is a no-op.
980 Because of that, we have to apply the addrs to the sections here.
981 N.B. if an objfile slides after we've already created it, then it
982 goes through objfile_relocate. */
984 for (i
= 0; i
< addrs
->num_sections
; i
++)
986 if (addrs
->other
[i
].name
== NULL
)
989 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
991 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
993 if (strcmp (bfd_sect_name
, addrs
->other
[i
].name
) == 0)
995 obj_section_offset (osect
) = addrs
->other
[i
].addr
;
1001 objfile
->sect_index_text
= 0;
1003 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
1005 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
1006 int sect_index
= osect
->the_bfd_section
->index
;
1008 if (strncmp (bfd_sect_name
, "LC_SEGMENT.", 11) == 0)
1009 bfd_sect_name
+= 11;
1010 if (strcmp (bfd_sect_name
, "__TEXT") == 0
1011 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
1012 objfile
->sect_index_text
= sect_index
;
1016 static const struct sym_fns macho_sym_fns
= {
1017 bfd_target_mach_o_flavour
,
1019 macho_new_init
, /* init anything gbl to entire symtab */
1020 macho_symfile_init
, /* read initial info, setup for sym_read() */
1021 macho_symfile_read
, /* read a symbol file into symtab */
1022 NULL
, /* sym_read_psymbols */
1023 macho_symfile_finish
, /* finished with file, cleanup */
1024 macho_symfile_offsets
, /* xlate external to internal form */
1025 default_symfile_segments
, /* Get segment information from a file. */
1027 macho_symfile_relocate
, /* Relocate a debug section. */
1032 _initialize_machoread ()
1034 add_symtab_fns (&macho_sym_fns
);
1036 add_setshow_zinteger_cmd ("mach-o", class_obscure
,
1037 &mach_o_debug_level
,
1038 _("Set if printing Mach-O symbols processing."),
1039 _("Show if printing Mach-O symbols processing."),
1041 &setdebuglist
, &showdebuglist
);