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"
37 /* If non-zero displays debugging message. */
38 static unsigned int mach_o_debug_level
= 0;
40 /* Dwarf debugging information are never in the final executable. They stay
41 in object files and the executable contains the list of object files read
43 Each time an oso (other source) is found in the executable, the reader
44 creates such a structure. They are read after the processing of the
49 /* Object file name. Can also be a member name. */
52 /* Associated time stamp. */
55 /* Stab symbols range for this OSO. */
59 /* Number of interesting stabs in the range. */
60 unsigned int nbr_syms
;
64 /* Vector of object files to be read after the executable. */
68 macho_new_init (struct objfile
*objfile
)
73 macho_symfile_init (struct objfile
*objfile
)
75 objfile
->flags
|= OBJF_REORDERED
;
78 /* Add a new OSO to the vector of OSO to load. */
81 macho_register_oso (VEC (oso_el
) **oso_vector_ptr
,
82 struct objfile
*objfile
,
83 asymbol
**oso_sym
, asymbol
**end_sym
,
84 unsigned int nbr_syms
)
88 el
.name
= (*oso_sym
)->name
;
89 el
.mtime
= (*oso_sym
)->value
;
92 el
.nbr_syms
= nbr_syms
;
93 VEC_safe_push (oso_el
, *oso_vector_ptr
, &el
);
96 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
99 macho_symtab_add_minsym (struct objfile
*objfile
, const asymbol
*sym
)
101 if (sym
->name
== NULL
|| *sym
->name
== '\0')
103 /* Skip names that don't exist (shouldn't happen), or names
104 that are null strings (may happen). */
108 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
111 enum minimal_symbol_type ms_type
;
113 /* Bfd symbols are section relative. */
114 symaddr
= sym
->value
+ sym
->section
->vma
;
116 if (sym
->section
== bfd_abs_section_ptr
)
118 else if (sym
->section
->flags
& SEC_CODE
)
120 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
123 ms_type
= mst_file_text
;
125 else if (sym
->section
->flags
& SEC_ALLOC
)
127 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
129 if (sym
->section
->flags
& SEC_LOAD
)
134 else if (sym
->flags
& BSF_LOCAL
)
136 /* Not a special stabs-in-elf symbol, do regular
137 symbol processing. */
138 if (sym
->section
->flags
& SEC_LOAD
)
139 ms_type
= mst_file_data
;
141 ms_type
= mst_file_bss
;
144 ms_type
= mst_unknown
;
147 return; /* Skip this symbol. */
149 prim_record_minimal_symbol_and_info
150 (sym
->name
, symaddr
, ms_type
,
151 gdb_bfd_section_index (objfile
->obfd
, sym
->section
),
156 /* Build the minimal symbol table from SYMBOL_TABLE of length
157 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
160 macho_symtab_read (struct objfile
*objfile
,
161 long number_of_symbols
, asymbol
**symbol_table
,
162 VEC (oso_el
) **oso_vector_ptr
)
165 const asymbol
*file_so
= NULL
;
166 asymbol
**oso_file
= NULL
;
167 unsigned int nbr_syms
= 0;
169 /* Current state while reading stabs. */
172 /* Not within an SO part. Only non-debugging symbols should be present,
173 and will be added to the minimal symbols table. */
176 /* First SO read. Introduce an SO section, and may be followed by a second
177 SO. The SO section should contain onl debugging symbols. */
180 /* Second non-null SO found, just after the first one. Means that the first
181 is in fact a directory name. */
184 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
190 for (i
= 0; i
< number_of_symbols
; i
++)
192 const asymbol
*sym
= symbol_table
[i
];
193 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
198 if (mach_o_sym
->n_type
== N_SO
)
200 /* Start of object stab. */
201 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
203 /* Unexpected empty N_SO. */
204 complaint (&symfile_complaints
,
205 _("Unexpected empty N_SO stab"));
213 else if (sym
->flags
& BSF_DEBUGGING
)
215 if (mach_o_sym
->n_type
== N_OPT
)
217 /* No complaint for OPT. */
221 /* Debugging symbols are not expected here. */
222 complaint (&symfile_complaints
,
223 _("%s: Unexpected debug stab outside SO markers"),
224 objfile_name (objfile
));
228 /* Non-debugging symbols go to the minimal symbol table. */
229 macho_symtab_add_minsym (objfile
, sym
);
235 if (mach_o_sym
->n_type
== N_SO
)
237 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
239 /* Unexpected empty N_SO. */
240 complaint (&symfile_complaints
, _("Empty SO section"));
243 else if (state
== S_FIRST_SO
)
245 /* Second SO stab for the file name. */
250 complaint (&symfile_complaints
, _("Three SO in a raw"));
252 else if (mach_o_sym
->n_type
== N_OSO
)
254 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
256 /* Empty OSO. Means that this file was compiled with
259 warning (_("stabs debugging not supported for %s"),
264 /* Non-empty OSO for a Dwarf file. */
265 oso_file
= symbol_table
+ i
;
267 state
= S_DWARF_FILE
;
271 complaint (&symfile_complaints
,
272 _("Unexpected stab after SO"));
277 if (mach_o_sym
->n_type
== N_SO
)
279 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
282 if (state
== S_DWARF_FILE
)
283 macho_register_oso (oso_vector_ptr
, objfile
,
284 oso_file
, symbol_table
+ i
,
290 complaint (&symfile_complaints
, _("Missing nul SO"));
295 else if (sym
->flags
& BSF_DEBUGGING
)
297 if (state
== S_STAB_FILE
)
299 /* FIXME: to be implemented. */
303 switch (mach_o_sym
->n_type
)
306 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
310 /* Interesting symbol. */
318 complaint (&symfile_complaints
,
319 _("unhandled stab for dwarf OSO file"));
325 complaint (&symfile_complaints
,
326 _("non-debugging symbol within SO"));
331 if (state
!= S_NO_SO
)
332 complaint (&symfile_complaints
, _("missing nul SO"));
335 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
336 returns the length of the archive name.
337 Returns -1 otherwise. */
340 get_archive_prefix_len (const char *name
)
343 int name_len
= strlen (name
);
345 if (name_len
== 0 || name
[name_len
- 1] != ')')
348 lparen
= strrchr (name
, '(');
349 if (lparen
== NULL
|| lparen
== name
)
351 return lparen
- name
;
354 /* Compare function to qsort OSOs, so that members of a library are
358 oso_el_compare_name (const void *vl
, const void *vr
)
360 const oso_el
*l
= (const oso_el
*)vl
;
361 const oso_el
*r
= (const oso_el
*)vr
;
363 return strcmp (l
->name
, r
->name
);
366 /* Hash table entry structure for the stabs symbols in the main object file.
367 This is used to speed up lookup for symbols in the OSO. */
369 struct macho_sym_hash_entry
371 struct bfd_hash_entry base
;
375 /* Routine to create an entry in the hash table. */
377 static struct bfd_hash_entry
*
378 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
379 struct bfd_hash_table
*table
,
382 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
384 /* Allocate the structure if it has not already been allocated by a
387 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
392 /* Call the allocation method of the superclass. */
393 ret
= (struct macho_sym_hash_entry
*)
394 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
398 /* Initialize the local fields. */
402 return (struct bfd_hash_entry
*) ret
;
405 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
406 to get the value of global and common symbols. */
409 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
411 /* For common symbol and global symbols, use the min symtab. */
412 struct bound_minimal_symbol msym
;
413 const char *name
= sym
->name
;
415 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
417 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
418 if (msym
.minsym
== NULL
)
420 warning (_("can't find symbol '%s' in minsymtab"), name
);
424 return BMSYMBOL_VALUE_ADDRESS (msym
);
427 /* Add oso file OSO/ABFD as a symbol file. */
430 macho_add_oso_symfile (oso_el
*oso
, bfd
*abfd
, const char *name
,
431 struct objfile
*main_objfile
, int symfile_flags
)
435 asymbol
**symbol_table
;
437 struct bfd_hash_table table
;
439 struct cleanup
*cleanup
;
441 /* Per section flag to mark which section have been rebased. */
442 unsigned char *sections_rebased
;
444 if (mach_o_debug_level
> 0)
446 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
448 if (!bfd_check_format (abfd
, bfd_object
))
450 warning (_("`%s': can't read symbols: %s."), oso
->name
,
451 bfd_errmsg (bfd_get_error ()));
452 gdb_bfd_unref (abfd
);
456 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
))
458 warning (_("`%s': file time stamp mismatch."), oso
->name
);
459 gdb_bfd_unref (abfd
);
463 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
464 sizeof (struct macho_sym_hash_entry
),
467 warning (_("`%s': can't create hash table"), oso
->name
);
468 gdb_bfd_unref (abfd
);
472 bfd_set_cacheable (abfd
, 1);
474 /* Read symbols table. */
475 storage
= bfd_get_symtab_upper_bound (abfd
);
476 symbol_table
= (asymbol
**) xmalloc (storage
);
477 bfd_canonicalize_symtab (abfd
, symbol_table
);
479 /* Init section flags. */
480 nbr_sections
= bfd_count_sections (abfd
);
481 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
482 for (i
= 0; i
< nbr_sections
; i
++)
483 sections_rebased
[i
] = 0;
485 /* Put symbols for the OSO file in the hash table. */
486 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
488 const asymbol
*sym
= *symp
;
489 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
491 switch (mach_o_sym
->n_type
)
499 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
510 struct macho_sym_hash_entry
*ent
;
512 ent
= (struct macho_sym_hash_entry
*)
513 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
514 if (ent
->sym
!= NULL
)
515 complaint (&symfile_complaints
,
516 _("Duplicated symbol %s in symbol table"), sym
->name
);
519 if (mach_o_debug_level
> 4)
521 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
523 (_("Adding symbol %s (addr: %s)\n"),
524 sym
->name
, paddress (arch
, sym
->value
));
531 /* Relocate symbols of the OSO. */
532 for (i
= 0; symbol_table
[i
]; i
++)
534 asymbol
*sym
= symbol_table
[i
];
535 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
537 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
539 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
542 /* For common symbol use the min symtab and modify the OSO
546 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
549 sym
->section
= bfd_com_section_ptr
;
553 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
556 asection
*sec
= sym
->section
;
557 bfd_mach_o_section
*msec
;
558 unsigned int sec_type
;
560 /* Skip buggy ones. */
561 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
564 /* Only consider regular, non-debugging sections. */
565 msec
= bfd_mach_o_get_mach_o_section (sec
);
566 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
567 if ((sec_type
== BFD_MACH_O_S_REGULAR
568 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
569 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
573 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
575 /* Use the min symtab for global symbols. */
576 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
580 struct macho_sym_hash_entry
*ent
;
582 ent
= (struct macho_sym_hash_entry
*)
583 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
585 addr
= bfd_asymbol_value (ent
->sym
);
588 /* Adjust the section. */
591 CORE_ADDR res
= addr
- sym
->value
;
593 if (mach_o_debug_level
> 3)
595 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
597 (_("resolve sect %s with %s (set to %s)\n"),
598 sec
->name
, sym
->name
,
599 paddress (arch
, res
));
601 bfd_set_section_vma (abfd
, sec
, res
);
602 sections_rebased
[sec
->index
] = 1;
607 /* Mark the section as never rebased. */
608 sections_rebased
[sec
->index
] = 2;
613 bfd_hash_table_free (&table
);
615 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
616 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
617 cleanup
= make_cleanup_bfd_unref (abfd
);
618 symbol_file_add_from_bfd
619 (abfd
, name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
), NULL
,
620 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
621 | OBJF_READNOW
| OBJF_USERLOADED
),
623 do_cleanups (cleanup
);
626 /* Read symbols from the vector of oso files.
628 Note that this function sorts OSO_VECTOR_PTR. */
631 macho_symfile_read_all_oso (VEC (oso_el
) **oso_vector_ptr
,
632 struct objfile
*main_objfile
,
636 VEC (oso_el
) *vec
= *oso_vector_ptr
;
638 struct cleanup
*cleanup
= make_cleanup (null_cleanup
, NULL
);
640 /* Sort oso by name so that files from libraries are gathered. */
641 qsort (VEC_address (oso_el
, vec
), VEC_length (oso_el
, vec
),
642 sizeof (oso_el
), oso_el_compare_name
);
644 for (ix
= 0; VEC_iterate (oso_el
, vec
, ix
, oso
);)
648 /* Check if this is a library name. */
649 pfx_len
= get_archive_prefix_len (oso
->name
);
654 char *archive_name
= XNEWVEC (char, pfx_len
+ 1);
659 memcpy (archive_name
, oso
->name
, pfx_len
);
660 archive_name
[pfx_len
] = '\0';
662 make_cleanup (xfree
, archive_name
);
664 /* Compute number of oso for this archive. */
666 VEC_iterate (oso_el
, vec
, last_ix
, oso2
); last_ix
++)
668 if (strncmp (oso2
->name
, archive_name
, pfx_len
) != 0)
672 /* Open the archive and check the format. */
673 archive_bfd
= gdb_bfd_open (archive_name
, gnutarget
, -1);
674 if (archive_bfd
== NULL
)
676 warning (_("Could not open OSO archive file \"%s\""),
681 if (!bfd_check_format (archive_bfd
, bfd_archive
))
683 warning (_("OSO archive file \"%s\" not an archive."),
685 gdb_bfd_unref (archive_bfd
);
690 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
, NULL
);
692 if (member_bfd
== NULL
)
694 warning (_("Could not read archive members out of "
695 "OSO archive \"%s\""), archive_name
);
696 gdb_bfd_unref (archive_bfd
);
701 /* Load all oso in this library. */
702 while (member_bfd
!= NULL
)
705 const char *member_name
= member_bfd
->filename
;
706 int member_len
= strlen (member_name
);
708 /* If this member is referenced, add it as a symfile. */
709 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
711 oso2
= VEC_index (oso_el
, vec
, ix2
);
714 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
715 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
718 macho_add_oso_symfile (oso2
, member_bfd
,
719 bfd_get_filename (member_bfd
),
720 main_objfile
, symfile_flags
);
727 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
,
730 /* Free previous member if not referenced by an oso. */
732 gdb_bfd_unref (prev
);
734 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
736 oso_el
*oso2
= VEC_index (oso_el
, vec
, ix2
);
738 if (oso2
->name
!= NULL
)
739 warning (_("Could not find specified archive member "
740 "for OSO name \"%s\""), oso
->name
);
748 abfd
= gdb_bfd_open (oso
->name
, gnutarget
, -1);
750 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
751 bfd_errmsg (bfd_get_error ()));
753 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
760 do_cleanups (cleanup
);
763 /* DSYM (debug symbols) files contain the debug info of an executable.
764 This is a separate file created by dsymutil(1) and is similar to debug
766 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
767 executable name and the executable base name to get the DSYM file name. */
768 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
770 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
771 and return *FILENAMEP with its original xmalloc-ated filename.
772 Return NULL if no valid dsym file is found (FILENAMEP is not used in
776 macho_check_dsym (struct objfile
*objfile
, char **filenamep
)
778 size_t name_len
= strlen (objfile_name (objfile
));
779 size_t dsym_len
= strlen (DSYM_SUFFIX
);
780 const char *base_name
= lbasename (objfile_name (objfile
));
781 size_t base_len
= strlen (base_name
);
782 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
784 bfd_mach_o_load_command
*main_uuid
;
785 bfd_mach_o_load_command
*dsym_uuid
;
787 strcpy (dsym_filename
, objfile_name (objfile
));
788 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
789 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
791 if (access (dsym_filename
, R_OK
) != 0)
794 if (bfd_mach_o_lookup_command (objfile
->obfd
,
795 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
797 warning (_("can't find UUID in %s"), objfile_name (objfile
));
800 dsym_bfd
= gdb_bfd_openr (dsym_filename
, gnutarget
);
801 if (dsym_bfd
== NULL
)
803 warning (_("can't open dsym file %s"), dsym_filename
);
807 if (!bfd_check_format (dsym_bfd
, bfd_object
))
809 gdb_bfd_unref (dsym_bfd
);
810 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
814 if (bfd_mach_o_lookup_command (dsym_bfd
,
815 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
817 warning (_("can't find UUID in %s"), dsym_filename
);
818 gdb_bfd_unref (dsym_bfd
);
821 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
822 sizeof (main_uuid
->command
.uuid
.uuid
)))
824 warning (_("dsym file UUID doesn't match the one in %s"),
825 objfile_name (objfile
));
826 gdb_bfd_unref (dsym_bfd
);
829 *filenamep
= xstrdup (dsym_filename
);
834 macho_symfile_read (struct objfile
*objfile
, int symfile_flags
)
836 bfd
*abfd
= objfile
->obfd
;
839 VEC (oso_el
) *oso_vector
= NULL
;
840 struct cleanup
*old_chain
= make_cleanup (VEC_cleanup (oso_el
), &oso_vector
);
842 /* Get symbols from the symbol table only if the file is an executable.
843 The symbol table of object files is not relocated and is expected to
844 be in the executable. */
845 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
849 /* Process the normal symbol table first. */
850 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
851 if (storage_needed
< 0)
852 error (_("Can't read symbols from %s: %s"),
853 bfd_get_filename (objfile
->obfd
),
854 bfd_errmsg (bfd_get_error ()));
856 if (storage_needed
> 0)
858 asymbol
**symbol_table
;
861 symbol_table
= (asymbol
**) xmalloc (storage_needed
);
862 make_cleanup (xfree
, symbol_table
);
864 init_minimal_symbol_collection ();
865 make_cleanup_discard_minimal_symbols ();
867 symcount
= bfd_canonicalize_symtab (objfile
->obfd
, symbol_table
);
870 error (_("Can't read symbols from %s: %s"),
871 bfd_get_filename (objfile
->obfd
),
872 bfd_errmsg (bfd_get_error ()));
874 macho_symtab_read (objfile
, symcount
, symbol_table
, &oso_vector
);
876 install_minimal_symbols (objfile
);
879 /* Try to read .eh_frame / .debug_frame. */
880 /* First, locate these sections. We ignore the result status
881 as it only checks for debug info. */
882 dwarf2_has_info (objfile
, NULL
);
883 dwarf2_build_frame_info (objfile
);
885 /* Check for DSYM file. */
886 dsym_bfd
= macho_check_dsym (objfile
, &dsym_filename
);
887 if (dsym_bfd
!= NULL
)
889 struct bfd_section
*asect
, *dsect
;
891 make_cleanup (xfree
, dsym_filename
);
893 if (mach_o_debug_level
> 0)
894 printf_unfiltered (_("dsym file found\n"));
896 /* Set dsym section size. */
897 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
899 asect
= asect
->next
, dsect
= dsect
->next
)
901 if (strcmp (asect
->name
, dsect
->name
) != 0)
903 bfd_set_section_size (dsym_bfd
, dsect
,
904 bfd_get_section_size (asect
));
907 /* Add the dsym file as a separate file. */
908 make_cleanup_bfd_unref (dsym_bfd
);
909 symbol_file_add_separate (dsym_bfd
, dsym_filename
, symfile_flags
,
912 /* Don't try to read dwarf2 from main file or shared libraries. */
913 do_cleanups (old_chain
);
918 if (dwarf2_has_info (objfile
, NULL
))
920 /* DWARF 2 sections */
921 dwarf2_build_psymtabs (objfile
);
925 if (oso_vector
!= NULL
)
926 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
928 do_cleanups (old_chain
);
932 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
935 bfd
*abfd
= objfile
->obfd
;
937 /* We're only interested in sections with relocation
939 if ((sectp
->flags
& SEC_RELOC
) == 0)
942 if (mach_o_debug_level
> 0)
943 printf_unfiltered (_("Relocate section '%s' of %s\n"),
944 sectp
->name
, objfile_name (objfile
));
946 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
950 macho_symfile_finish (struct objfile
*objfile
)
955 macho_symfile_offsets (struct objfile
*objfile
,
956 const struct section_addr_info
*addrs
)
959 struct obj_section
*osect
;
961 /* Allocate section_offsets. */
962 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
963 objfile
->section_offsets
= (struct section_offsets
*)
964 obstack_alloc (&objfile
->objfile_obstack
,
965 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
966 memset (objfile
->section_offsets
, 0,
967 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
969 /* This code is run when we first add the objfile with
970 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
971 passed in. The place in symfile.c where the addrs are applied
972 depends on the addrs having section names. But in the dyld code
973 we build an anonymous array of addrs, so that code is a no-op.
974 Because of that, we have to apply the addrs to the sections here.
975 N.B. if an objfile slides after we've already created it, then it
976 goes through objfile_relocate. */
978 for (i
= 0; i
< addrs
->num_sections
; i
++)
980 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
982 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
984 if (strcmp (bfd_sect_name
, addrs
->other
[i
].name
) == 0)
986 obj_section_offset (osect
) = addrs
->other
[i
].addr
;
992 objfile
->sect_index_text
= 0;
994 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
996 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
997 int sect_index
= osect
- objfile
->sections
;;
999 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
1000 bfd_sect_name
+= 11;
1001 if (strcmp (bfd_sect_name
, "__TEXT") == 0
1002 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
1003 objfile
->sect_index_text
= sect_index
;
1007 static const struct sym_fns macho_sym_fns
= {
1008 macho_new_init
, /* init anything gbl to entire symtab */
1009 macho_symfile_init
, /* read initial info, setup for sym_read() */
1010 macho_symfile_read
, /* read a symbol file into symtab */
1011 NULL
, /* sym_read_psymbols */
1012 macho_symfile_finish
, /* finished with file, cleanup */
1013 macho_symfile_offsets
, /* xlate external to internal form */
1014 default_symfile_segments
, /* Get segment information from a file. */
1016 macho_symfile_relocate
, /* Relocate a debug section. */
1017 NULL
, /* sym_get_probes */
1021 /* -Wmissing-prototypes */
1022 extern initialize_file_ftype _initialize_machoread
;
1025 _initialize_machoread (void)
1027 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
1029 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
1030 &mach_o_debug_level
,
1031 _("Set if printing Mach-O symbols processing."),
1032 _("Show if printing Mach-O symbols processing."),
1034 &setdebuglist
, &showdebuglist
);