1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2013 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 "gdb_assert.h"
32 #include "aout/stab_gnu.h"
35 #include "complaints.h"
40 /* If non-zero displays debugging message. */
41 static unsigned 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. */
71 macho_new_init (struct objfile
*objfile
)
76 macho_symfile_init (struct objfile
*objfile
)
78 objfile
->flags
|= OBJF_REORDERED
;
81 /* Add a new OSO to the vector of OSO to load. */
84 macho_register_oso (VEC (oso_el
) **oso_vector_ptr
,
85 struct objfile
*objfile
,
86 asymbol
**oso_sym
, asymbol
**end_sym
,
87 unsigned int nbr_syms
)
91 el
.name
= (*oso_sym
)->name
;
92 el
.mtime
= (*oso_sym
)->value
;
95 el
.nbr_syms
= nbr_syms
;
96 VEC_safe_push (oso_el
, *oso_vector_ptr
, &el
);
99 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
102 macho_symtab_add_minsym (struct objfile
*objfile
, const asymbol
*sym
)
104 if (sym
->name
== NULL
|| *sym
->name
== '\0')
106 /* Skip names that don't exist (shouldn't happen), or names
107 that are null strings (may happen). */
111 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
115 enum minimal_symbol_type ms_type
;
117 offset
= ANOFFSET (objfile
->section_offsets
,
118 gdb_bfd_section_index (objfile
->obfd
, sym
->section
));
120 /* Bfd symbols are section relative. */
121 symaddr
= sym
->value
+ sym
->section
->vma
;
123 /* Select global/local/weak symbols. Note that bfd puts abs
124 symbols in their own section, so all symbols we are
125 interested in will have a section. */
126 /* Relocate all non-absolute and non-TLS symbols by the
128 if (sym
->section
!= bfd_abs_section_ptr
129 && !(sym
->section
->flags
& SEC_THREAD_LOCAL
))
132 if (sym
->section
== bfd_abs_section_ptr
)
134 else if (sym
->section
->flags
& SEC_CODE
)
136 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
139 ms_type
= mst_file_text
;
141 else if (sym
->section
->flags
& SEC_ALLOC
)
143 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
145 if (sym
->section
->flags
& SEC_LOAD
)
150 else if (sym
->flags
& BSF_LOCAL
)
152 /* Not a special stabs-in-elf symbol, do regular
153 symbol processing. */
154 if (sym
->section
->flags
& SEC_LOAD
)
155 ms_type
= mst_file_data
;
157 ms_type
= mst_file_bss
;
160 ms_type
= mst_unknown
;
163 return; /* Skip this symbol. */
165 prim_record_minimal_symbol_and_info
166 (sym
->name
, symaddr
, ms_type
,
167 gdb_bfd_section_index (objfile
->obfd
, sym
->section
),
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
,
178 VEC (oso_el
) **oso_vector_ptr
)
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 (oso_vector_ptr
, objfile
,
303 oso_file
, symbol_table
+ i
,
309 complaint (&symfile_complaints
, _("Missing nul SO"));
315 else if (sym
->flags
& BSF_DEBUGGING
)
317 if (state
== S_STAB_FILE
)
319 /* FIXME: to be implemented. */
323 switch (mach_o_sym
->n_type
)
326 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
330 /* Interesting symbol. */
338 complaint (&symfile_complaints
,
339 _("unhandled stab for dwarf OSO file"));
345 complaint (&symfile_complaints
,
346 _("non-debugging symbol within SO"));
351 if (state
!= S_NO_SO
)
352 complaint (&symfile_complaints
, _("missing nul SO"));
355 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
356 returns the length of the archive name.
357 Returns -1 otherwise. */
360 get_archive_prefix_len (const char *name
)
363 int name_len
= strlen (name
);
365 if (name_len
== 0 || name
[name_len
- 1] != ')')
368 lparen
= strrchr (name
, '(');
369 if (lparen
== NULL
|| lparen
== name
)
371 return lparen
- name
;
374 /* Compare function to qsort OSOs, so that members of a library are
378 oso_el_compare_name (const void *vl
, const void *vr
)
380 const oso_el
*l
= (const oso_el
*)vl
;
381 const oso_el
*r
= (const oso_el
*)vr
;
383 return strcmp (l
->name
, r
->name
);
386 /* Hash table entry structure for the stabs symbols in the main object file.
387 This is used to speed up lookup for symbols in the OSO. */
389 struct macho_sym_hash_entry
391 struct bfd_hash_entry base
;
395 /* Routine to create an entry in the hash table. */
397 static struct bfd_hash_entry
*
398 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
399 struct bfd_hash_table
*table
,
402 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
404 /* Allocate the structure if it has not already been allocated by a
407 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
412 /* Call the allocation method of the superclass. */
413 ret
= (struct macho_sym_hash_entry
*)
414 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
418 /* Initialize the local fields. */
422 return (struct bfd_hash_entry
*) ret
;
425 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
426 to get the value of global and common symbols. */
429 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
431 /* For common symbol and global symbols, use the min symtab. */
432 struct minimal_symbol
*msym
;
433 const char *name
= sym
->name
;
435 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
437 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
440 warning (_("can't find symbol '%s' in minsymtab"), name
);
444 return SYMBOL_VALUE_ADDRESS (msym
);
447 /* Add oso file OSO/ABFD as a symbol file. */
450 macho_add_oso_symfile (oso_el
*oso
, bfd
*abfd
,
451 struct objfile
*main_objfile
, int symfile_flags
)
455 asymbol
**symbol_table
;
457 struct bfd_hash_table table
;
459 struct cleanup
*cleanup
;
461 /* Per section flag to mark which section have been rebased. */
462 unsigned char *sections_rebased
;
464 if (mach_o_debug_level
> 0)
466 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
468 if (!bfd_check_format (abfd
, bfd_object
))
470 warning (_("`%s': can't read symbols: %s."), oso
->name
,
471 bfd_errmsg (bfd_get_error ()));
472 gdb_bfd_unref (abfd
);
476 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
))
478 warning (_("`%s': file time stamp mismatch."), oso
->name
);
479 gdb_bfd_unref (abfd
);
483 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
484 sizeof (struct macho_sym_hash_entry
),
487 warning (_("`%s': can't create hash table"), oso
->name
);
488 gdb_bfd_unref (abfd
);
492 bfd_set_cacheable (abfd
, 1);
494 /* Read symbols table. */
495 storage
= bfd_get_symtab_upper_bound (abfd
);
496 symbol_table
= (asymbol
**) xmalloc (storage
);
497 bfd_canonicalize_symtab (abfd
, symbol_table
);
499 /* Init section flags. */
500 nbr_sections
= bfd_count_sections (abfd
);
501 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
502 for (i
= 0; i
< nbr_sections
; i
++)
503 sections_rebased
[i
] = 0;
505 /* Put symbols for the OSO file in the hash table. */
506 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
508 const asymbol
*sym
= *symp
;
509 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
511 switch (mach_o_sym
->n_type
)
519 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
530 struct macho_sym_hash_entry
*ent
;
532 ent
= (struct macho_sym_hash_entry
*)
533 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
534 if (ent
->sym
!= NULL
)
535 complaint (&symfile_complaints
,
536 _("Duplicated symbol %s in symbol table"), sym
->name
);
539 if (mach_o_debug_level
> 4)
541 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
543 (_("Adding symbol %s (addr: %s)\n"),
544 sym
->name
, paddress (arch
, sym
->value
));
551 /* Relocate symbols of the OSO. */
552 for (i
= 0; symbol_table
[i
]; i
++)
554 asymbol
*sym
= symbol_table
[i
];
555 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
557 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
559 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
562 /* For common symbol use the min symtab and modify the OSO
566 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
569 sym
->section
= bfd_com_section_ptr
;
573 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
576 asection
*sec
= sym
->section
;
577 bfd_mach_o_section
*msec
;
578 unsigned int sec_type
;
580 /* Skip buggy ones. */
581 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
584 /* Only consider regular, non-debugging sections. */
585 msec
= bfd_mach_o_get_mach_o_section (sec
);
586 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
587 if ((sec_type
== BFD_MACH_O_S_REGULAR
588 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
589 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
593 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
595 /* Use the min symtab for global symbols. */
596 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
600 struct macho_sym_hash_entry
*ent
;
602 ent
= (struct macho_sym_hash_entry
*)
603 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
605 addr
= bfd_asymbol_value (ent
->sym
);
608 /* Adjust the section. */
611 CORE_ADDR res
= addr
- sym
->value
;
613 if (mach_o_debug_level
> 3)
615 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
617 (_("resolve sect %s with %s (set to %s)\n"),
618 sec
->name
, sym
->name
,
619 paddress (arch
, res
));
621 bfd_set_section_vma (abfd
, sec
, res
);
622 sections_rebased
[sec
->index
] = 1;
627 /* Mark the section as never rebased. */
628 sections_rebased
[sec
->index
] = 2;
633 bfd_hash_table_free (&table
);
635 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
636 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
637 cleanup
= make_cleanup_bfd_unref (abfd
);
638 symbol_file_add_from_bfd
639 (abfd
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
), NULL
,
640 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
641 | OBJF_READNOW
| OBJF_USERLOADED
),
643 do_cleanups (cleanup
);
646 /* Read symbols from the vector of oso files.
648 Note that this function sorts OSO_VECTOR_PTR. */
651 macho_symfile_read_all_oso (VEC (oso_el
) **oso_vector_ptr
,
652 struct objfile
*main_objfile
,
656 VEC (oso_el
) *vec
= *oso_vector_ptr
;
658 struct cleanup
*cleanup
= make_cleanup (null_cleanup
, NULL
);
660 /* Sort oso by name so that files from libraries are gathered. */
661 qsort (VEC_address (oso_el
, vec
), VEC_length (oso_el
, vec
),
662 sizeof (oso_el
), oso_el_compare_name
);
664 for (ix
= 0; VEC_iterate (oso_el
, vec
, ix
, oso
);)
668 /* Check if this is a library name. */
669 pfx_len
= get_archive_prefix_len (oso
->name
);
674 char *archive_name
= XNEWVEC (char, pfx_len
+ 1);
679 memcpy (archive_name
, oso
->name
, pfx_len
);
680 archive_name
[pfx_len
] = '\0';
682 make_cleanup (xfree
, archive_name
);
684 /* Compute number of oso for this archive. */
686 VEC_iterate (oso_el
, vec
, last_ix
, oso2
); last_ix
++)
688 if (strncmp (oso2
->name
, archive_name
, pfx_len
) != 0)
692 /* Open the archive and check the format. */
693 archive_bfd
= gdb_bfd_open (archive_name
, gnutarget
, -1);
694 if (archive_bfd
== NULL
)
696 warning (_("Could not open OSO archive file \"%s\""),
701 if (!bfd_check_format (archive_bfd
, bfd_archive
))
703 warning (_("OSO archive file \"%s\" not an archive."),
705 gdb_bfd_unref (archive_bfd
);
710 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
, NULL
);
712 if (member_bfd
== NULL
)
714 warning (_("Could not read archive members out of "
715 "OSO archive \"%s\""), archive_name
);
716 gdb_bfd_unref (archive_bfd
);
721 /* Load all oso in this library. */
722 while (member_bfd
!= NULL
)
725 const char *member_name
= member_bfd
->filename
;
726 int member_len
= strlen (member_name
);
728 /* If this member is referenced, add it as a symfile. */
729 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
731 oso2
= VEC_index (oso_el
, vec
, ix2
);
734 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
735 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
738 macho_add_oso_symfile (oso2
, member_bfd
,
739 main_objfile
, symfile_flags
);
746 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
,
749 /* Free previous member if not referenced by an oso. */
751 gdb_bfd_unref (prev
);
753 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
755 oso_el
*oso2
= VEC_index (oso_el
, vec
, ix2
);
757 if (oso2
->name
!= NULL
)
758 warning (_("Could not find specified archive member "
759 "for OSO name \"%s\""), oso
->name
);
767 abfd
= gdb_bfd_open (oso
->name
, gnutarget
, -1);
769 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
770 bfd_errmsg (bfd_get_error ()));
772 macho_add_oso_symfile (oso
, abfd
, main_objfile
, symfile_flags
);
778 do_cleanups (cleanup
);
781 /* DSYM (debug symbols) files contain the debug info of an executable.
782 This is a separate file created by dsymutil(1) and is similar to debug
784 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
785 executable name and the executable base name to get the DSYM file name. */
786 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
788 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
789 Return NULL if no valid dsym file is found. */
792 macho_check_dsym (struct objfile
*objfile
)
794 size_t name_len
= strlen (objfile
->name
);
795 size_t dsym_len
= strlen (DSYM_SUFFIX
);
796 const char *base_name
= lbasename (objfile
->name
);
797 size_t base_len
= strlen (base_name
);
798 char *dsym_filename
= alloca (name_len
+ dsym_len
+ base_len
+ 1);
800 bfd_mach_o_load_command
*main_uuid
;
801 bfd_mach_o_load_command
*dsym_uuid
;
803 strcpy (dsym_filename
, objfile
->name
);
804 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
805 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
807 if (access (dsym_filename
, R_OK
) != 0)
810 if (bfd_mach_o_lookup_command (objfile
->obfd
,
811 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
813 warning (_("can't find UUID in %s"), objfile
->name
);
816 dsym_bfd
= gdb_bfd_openr (dsym_filename
, gnutarget
);
817 if (dsym_bfd
== NULL
)
819 warning (_("can't open dsym file %s"), dsym_filename
);
823 if (!bfd_check_format (dsym_bfd
, bfd_object
))
825 gdb_bfd_unref (dsym_bfd
);
826 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
830 if (bfd_mach_o_lookup_command (dsym_bfd
,
831 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
833 warning (_("can't find UUID in %s"), dsym_filename
);
834 gdb_bfd_unref (dsym_bfd
);
837 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
838 sizeof (main_uuid
->command
.uuid
.uuid
)))
840 warning (_("dsym file UUID doesn't match the one in %s"), objfile
->name
);
841 gdb_bfd_unref (dsym_bfd
);
848 macho_symfile_read (struct objfile
*objfile
, int symfile_flags
)
850 bfd
*abfd
= objfile
->obfd
;
854 VEC (oso_el
) *oso_vector
= NULL
;
855 struct cleanup
*old_chain
= make_cleanup (VEC_cleanup (oso_el
), &oso_vector
);
857 /* Get symbols from the symbol table only if the file is an executable.
858 The symbol table of object files is not relocated and is expected to
859 be in the executable. */
860 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
862 /* Process the normal symbol table first. */
863 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
864 if (storage_needed
< 0)
865 error (_("Can't read symbols from %s: %s"),
866 bfd_get_filename (objfile
->obfd
),
867 bfd_errmsg (bfd_get_error ()));
869 if (storage_needed
> 0)
871 asymbol
**symbol_table
;
874 symbol_table
= (asymbol
**) xmalloc (storage_needed
);
875 make_cleanup (xfree
, symbol_table
);
877 init_minimal_symbol_collection ();
878 make_cleanup_discard_minimal_symbols ();
880 symcount
= bfd_canonicalize_symtab (objfile
->obfd
, symbol_table
);
883 error (_("Can't read symbols from %s: %s"),
884 bfd_get_filename (objfile
->obfd
),
885 bfd_errmsg (bfd_get_error ()));
887 macho_symtab_read (objfile
, symcount
, symbol_table
, &oso_vector
);
889 install_minimal_symbols (objfile
);
892 /* Try to read .eh_frame / .debug_frame. */
893 /* First, locate these sections. We ignore the result status
894 as it only checks for debug info. */
895 dwarf2_has_info (objfile
, NULL
);
896 dwarf2_build_frame_info (objfile
);
898 /* Check for DSYM file. */
899 dsym_bfd
= macho_check_dsym (objfile
);
900 if (dsym_bfd
!= NULL
)
904 struct bfd_section
*asect
, *dsect
;
906 if (mach_o_debug_level
> 0)
907 printf_unfiltered (_("dsym file found\n"));
909 /* Set dsym section size. */
910 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
912 asect
= asect
->next
, dsect
= dsect
->next
)
914 if (strcmp (asect
->name
, dsect
->name
) != 0)
916 bfd_set_section_size (dsym_bfd
, dsect
,
917 bfd_get_section_size (asect
));
920 /* Add the dsym file as a separate file. */
921 make_cleanup_bfd_unref (dsym_bfd
);
922 symbol_file_add_separate (dsym_bfd
, symfile_flags
, objfile
);
924 /* Don't try to read dwarf2 from main file or shared libraries. */
925 do_cleanups (old_chain
);
930 if (dwarf2_has_info (objfile
, NULL
))
932 /* DWARF 2 sections */
933 dwarf2_build_psymtabs (objfile
);
937 if (oso_vector
!= NULL
)
938 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
940 do_cleanups (old_chain
);
944 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
947 bfd
*abfd
= objfile
->obfd
;
949 /* We're only interested in sections with relocation
951 if ((sectp
->flags
& SEC_RELOC
) == 0)
954 if (mach_o_debug_level
> 0)
955 printf_unfiltered (_("Relocate section '%s' of %s\n"),
956 sectp
->name
, objfile
->name
);
958 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
962 macho_symfile_finish (struct objfile
*objfile
)
967 macho_symfile_offsets (struct objfile
*objfile
,
968 const struct section_addr_info
*addrs
)
971 unsigned int num_sections
;
972 struct obj_section
*osect
;
974 /* Allocate section_offsets. */
975 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
976 objfile
->section_offsets
= (struct section_offsets
*)
977 obstack_alloc (&objfile
->objfile_obstack
,
978 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
979 memset (objfile
->section_offsets
, 0,
980 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
982 /* This code is run when we first add the objfile with
983 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
984 passed in. The place in symfile.c where the addrs are applied
985 depends on the addrs having section names. But in the dyld code
986 we build an anonymous array of addrs, so that code is a no-op.
987 Because of that, we have to apply the addrs to the sections here.
988 N.B. if an objfile slides after we've already created it, then it
989 goes through objfile_relocate. */
991 for (i
= 0; i
< addrs
->num_sections
; i
++)
993 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
995 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
997 if (strcmp (bfd_sect_name
, addrs
->other
[i
].name
) == 0)
999 obj_section_offset (osect
) = addrs
->other
[i
].addr
;
1005 objfile
->sect_index_text
= 0;
1007 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
1009 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
1010 int sect_index
= osect
- objfile
->sections
;;
1012 if (strncmp (bfd_sect_name
, "LC_SEGMENT.", 11) == 0)
1013 bfd_sect_name
+= 11;
1014 if (strcmp (bfd_sect_name
, "__TEXT") == 0
1015 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
1016 objfile
->sect_index_text
= sect_index
;
1020 static const struct sym_fns macho_sym_fns
= {
1021 bfd_target_mach_o_flavour
,
1023 macho_new_init
, /* init anything gbl to entire symtab */
1024 macho_symfile_init
, /* read initial info, setup for sym_read() */
1025 macho_symfile_read
, /* read a symbol file into symtab */
1026 NULL
, /* sym_read_psymbols */
1027 macho_symfile_finish
, /* finished with file, cleanup */
1028 macho_symfile_offsets
, /* xlate external to internal form */
1029 default_symfile_segments
, /* Get segment information from a file. */
1031 macho_symfile_relocate
, /* Relocate a debug section. */
1032 NULL
, /* sym_get_probes */
1036 /* -Wmissing-prototypes */
1037 extern initialize_file_ftype _initialize_machoread
;
1040 _initialize_machoread (void)
1042 add_symtab_fns (&macho_sym_fns
);
1044 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
1045 &mach_o_debug_level
,
1046 _("Set if printing Mach-O symbols processing."),
1047 _("Show if printing Mach-O symbols processing."),
1049 &setdebuglist
, &showdebuglist
);