1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2023 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/>. */
30 #include "aout/stab_gnu.h"
31 #include "complaints.h"
35 #include "dwarf2/public.h"
37 /* If non-zero displays debugging message. */
38 static unsigned int mach_o_debug_level
= 0;
40 #define macho_debug(LEVEL, FMT, ...) \
41 debug_prefixed_printf_cond_nofunc (mach_o_debug_level > LEVEL, \
42 "machoread", FMT, ## __VA_ARGS__)
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 oso_el (asymbol
**oso_sym_
, asymbol
**end_sym_
, unsigned int nbr_syms_
)
54 : name((*oso_sym_
)->name
),
55 mtime((*oso_sym_
)->value
),
62 /* Object file name. Can also be a member name. */
65 /* Associated time stamp. */
68 /* Stab symbols range for this OSO. */
72 /* Number of interesting stabs in the range. */
73 unsigned int nbr_syms
;
77 macho_new_init (struct objfile
*objfile
)
82 macho_symfile_init (struct objfile
*objfile
)
84 objfile
->flags
|= OBJF_REORDERED
;
87 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
90 macho_symtab_add_minsym (minimal_symbol_reader
&reader
,
91 struct objfile
*objfile
, const asymbol
*sym
)
93 if (sym
->name
== NULL
|| *sym
->name
== '\0')
95 /* Skip names that don't exist (shouldn't happen), or names
96 that are null strings (may happen). */
100 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
103 enum minimal_symbol_type ms_type
;
105 /* Bfd symbols are section relative. */
106 symaddr
= sym
->value
+ sym
->section
->vma
;
108 if (sym
->section
== bfd_abs_section_ptr
)
110 else if (sym
->section
->flags
& SEC_CODE
)
112 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
115 ms_type
= mst_file_text
;
117 else if (sym
->section
->flags
& SEC_ALLOC
)
119 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
121 if (sym
->section
->flags
& SEC_LOAD
)
126 else if (sym
->flags
& BSF_LOCAL
)
128 /* Not a special stabs-in-elf symbol, do regular
129 symbol processing. */
130 if (sym
->section
->flags
& SEC_LOAD
)
131 ms_type
= mst_file_data
;
133 ms_type
= mst_file_bss
;
136 ms_type
= mst_unknown
;
139 return; /* Skip this symbol. */
141 reader
.record_with_info (sym
->name
, symaddr
, ms_type
,
142 gdb_bfd_section_index (objfile
->obfd
.get (),
147 /* Build the minimal symbol table from SYMBOL_TABLE of length
148 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
151 macho_symtab_read (minimal_symbol_reader
&reader
,
152 struct objfile
*objfile
,
153 long number_of_symbols
, asymbol
**symbol_table
,
154 std::vector
<oso_el
> *oso_vector_ptr
)
157 const asymbol
*file_so
= NULL
;
158 asymbol
**oso_file
= NULL
;
159 unsigned int nbr_syms
= 0;
161 /* Current state while reading stabs. */
164 /* Not within an SO part. Only non-debugging symbols should be present,
165 and will be added to the minimal symbols table. */
168 /* First SO read. Introduce an SO section, and may be followed by a second
169 SO. The SO section should contain onl debugging symbols. */
172 /* Second non-null SO found, just after the first one. Means that the first
173 is in fact a directory name. */
176 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
182 for (i
= 0; i
< number_of_symbols
; i
++)
184 const asymbol
*sym
= symbol_table
[i
];
185 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
190 if (mach_o_sym
->n_type
== N_SO
)
192 /* Start of object stab. */
193 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
195 /* Unexpected empty N_SO. */
196 complaint (_("Unexpected empty N_SO stab"));
204 else if (sym
->flags
& BSF_DEBUGGING
)
206 if (mach_o_sym
->n_type
== N_OPT
)
208 /* No complaint for OPT. */
212 /* Debugging symbols are not expected here. */
213 complaint (_("%s: Unexpected debug stab outside SO markers"),
214 objfile_name (objfile
));
218 /* Non-debugging symbols go to the minimal symbol table. */
219 macho_symtab_add_minsym (reader
, objfile
, sym
);
225 if (mach_o_sym
->n_type
== N_SO
)
227 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
229 /* Unexpected empty N_SO. */
230 complaint (_("Empty SO section"));
233 else if (state
== S_FIRST_SO
)
235 /* Second SO stab for the file name. */
240 complaint (_("Three SO in a raw"));
242 else if (mach_o_sym
->n_type
== N_OSO
)
244 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
246 /* Empty OSO. Means that this file was compiled with
249 warning (_("stabs debugging not supported for %s"),
254 /* Non-empty OSO for a Dwarf file. */
255 oso_file
= symbol_table
+ i
;
257 state
= S_DWARF_FILE
;
261 complaint (_("Unexpected stab after SO"));
266 if (mach_o_sym
->n_type
== N_SO
)
268 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
271 if (state
== S_DWARF_FILE
)
272 oso_vector_ptr
->emplace_back (oso_file
, symbol_table
+ i
,
278 complaint (_("Missing nul SO"));
283 else if (sym
->flags
& BSF_DEBUGGING
)
285 if (state
== S_STAB_FILE
)
287 /* FIXME: to be implemented. */
291 switch (mach_o_sym
->n_type
)
294 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
298 /* Interesting symbol. */
306 complaint (_("unhandled stab for dwarf OSO file"));
312 complaint (_("non-debugging symbol within SO"));
317 if (state
!= S_NO_SO
)
318 complaint (_("missing nul SO"));
321 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
322 returns the length of the archive name.
323 Returns -1 otherwise. */
326 get_archive_prefix_len (const char *name
)
329 int name_len
= strlen (name
);
331 if (name_len
== 0 || name
[name_len
- 1] != ')')
334 lparen
= strrchr (name
, '(');
335 if (lparen
== NULL
|| lparen
== name
)
337 return lparen
- name
;
340 /* Compare function to std::sort OSOs, so that members of a library
344 oso_el_compare_name (const oso_el
&l
, const oso_el
&r
)
346 return strcmp (l
.name
, r
.name
) < 0;
349 /* Hash table entry structure for the stabs symbols in the main object file.
350 This is used to speed up lookup for symbols in the OSO. */
352 struct macho_sym_hash_entry
354 struct bfd_hash_entry base
;
358 /* Routine to create an entry in the hash table. */
360 static struct bfd_hash_entry
*
361 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
362 struct bfd_hash_table
*table
,
365 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
367 /* Allocate the structure if it has not already been allocated by a
370 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
375 /* Call the allocation method of the superclass. */
376 ret
= (struct macho_sym_hash_entry
*)
377 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
381 /* Initialize the local fields. */
385 return (struct bfd_hash_entry
*) ret
;
388 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
389 to get the value of global and common symbols. */
392 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
394 /* For common symbol and global symbols, use the min symtab. */
395 struct bound_minimal_symbol msym
;
396 const char *name
= sym
->name
;
398 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
.get ()))
400 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
401 if (msym
.minsym
== NULL
)
403 warning (_("can't find symbol '%s' in minsymtab"), name
);
407 return msym
.value_address ();
410 /* Add oso file OSO/ABFD as a symbol file. */
413 macho_add_oso_symfile (oso_el
*oso
, const gdb_bfd_ref_ptr
&abfd
,
415 struct objfile
*main_objfile
,
416 symfile_add_flags symfile_flags
)
420 asymbol
**symbol_table
;
422 struct bfd_hash_table table
;
425 /* Per section flag to mark which section have been rebased. */
426 unsigned char *sections_rebased
;
428 macho_debug (0, _("Loading debugging symbols from oso: %s\n"), oso
->name
);
430 if (!bfd_check_format (abfd
.get (), bfd_object
))
432 warning (_("`%s': can't read symbols: %s."), oso
->name
,
433 bfd_errmsg (bfd_get_error ()));
437 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
.get ()))
439 warning (_("`%s': file time stamp mismatch."), oso
->name
);
443 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
444 sizeof (struct macho_sym_hash_entry
),
447 warning (_("`%s': can't create hash table"), oso
->name
);
451 bfd_set_cacheable (abfd
.get (), 1);
453 /* Read symbols table. */
454 storage
= bfd_get_symtab_upper_bound (abfd
.get ());
455 symbol_table
= (asymbol
**) xmalloc (storage
);
456 bfd_canonicalize_symtab (abfd
.get (), symbol_table
);
458 /* Init section flags. */
459 nbr_sections
= bfd_count_sections (abfd
.get ());
460 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
461 for (i
= 0; i
< nbr_sections
; i
++)
462 sections_rebased
[i
] = 0;
464 /* Put symbols for the OSO file in the hash table. */
465 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
467 const asymbol
*sym
= *symp
;
468 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
470 switch (mach_o_sym
->n_type
)
478 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
489 struct macho_sym_hash_entry
*ent
;
491 ent
= (struct macho_sym_hash_entry
*)
492 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
493 if (ent
->sym
!= NULL
)
494 complaint (_("Duplicated symbol %s in symbol table"), sym
->name
);
497 macho_debug (4, _("Adding symbol %s (addr: %s)\n"),
498 sym
->name
, paddress (main_objfile
->arch (),
505 /* Relocate symbols of the OSO. */
506 for (i
= 0; symbol_table
[i
]; i
++)
508 asymbol
*sym
= symbol_table
[i
];
509 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
511 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
513 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
516 /* For common symbol use the min symtab and modify the OSO
520 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
523 sym
->section
= bfd_com_section_ptr
;
527 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
530 asection
*sec
= sym
->section
;
531 bfd_mach_o_section
*msec
;
532 unsigned int sec_type
;
534 /* Skip buggy ones. */
535 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
538 /* Only consider regular, non-debugging sections. */
539 msec
= bfd_mach_o_get_mach_o_section (sec
);
540 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
541 if ((sec_type
== BFD_MACH_O_S_REGULAR
542 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
543 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
547 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
549 /* Use the min symtab for global symbols. */
550 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
554 struct macho_sym_hash_entry
*ent
;
556 ent
= (struct macho_sym_hash_entry
*)
557 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
559 addr
= bfd_asymbol_value (ent
->sym
);
562 /* Adjust the section. */
565 CORE_ADDR res
= addr
- sym
->value
;
567 macho_debug (3, _("resolve sect %s with %s (set to %s)\n"),
568 sec
->name
, sym
->name
,
569 paddress (main_objfile
->arch (), res
));
570 bfd_set_section_vma (sec
, res
);
571 sections_rebased
[sec
->index
] = 1;
576 /* Mark the section as never rebased. */
577 sections_rebased
[sec
->index
] = 2;
582 bfd_hash_table_free (&table
);
584 /* We need to clear SYMFILE_MAINLINE to avoid interactive question
585 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
586 symbol_file_add_from_bfd
587 (abfd
, name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
),
589 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
590 | OBJF_READNOW
| OBJF_USERLOADED
),
594 /* Read symbols from the vector of oso files.
596 Note that this function sorts OSO_VECTOR_PTR. */
599 macho_symfile_read_all_oso (std::vector
<oso_el
> *oso_vector_ptr
,
600 struct objfile
*main_objfile
,
601 symfile_add_flags symfile_flags
)
606 /* Sort oso by name so that files from libraries are gathered. */
607 std::sort (oso_vector_ptr
->begin (), oso_vector_ptr
->end (),
608 oso_el_compare_name
);
610 for (ix
= 0; ix
< oso_vector_ptr
->size ();)
614 oso
= &(*oso_vector_ptr
)[ix
];
616 /* Check if this is a library name. */
617 pfx_len
= get_archive_prefix_len (oso
->name
);
624 std::string
archive_name (oso
->name
, pfx_len
);
626 /* Compute number of oso for this archive. */
627 for (last_ix
= ix
; last_ix
< oso_vector_ptr
->size (); last_ix
++)
629 oso2
= &(*oso_vector_ptr
)[last_ix
];
630 if (strncmp (oso2
->name
, archive_name
.c_str (), pfx_len
) != 0)
634 /* Open the archive and check the format. */
635 gdb_bfd_ref_ptr
archive_bfd (gdb_bfd_open (archive_name
.c_str (),
637 if (archive_bfd
== NULL
)
639 warning (_("Could not open OSO archive file \"%s\""),
640 archive_name
.c_str ());
644 if (!bfd_check_format (archive_bfd
.get (), bfd_archive
))
646 warning (_("OSO archive file \"%s\" not an archive."),
647 archive_name
.c_str ());
652 gdb_bfd_ref_ptr member_bfd
653 (gdb_bfd_openr_next_archived_file (archive_bfd
.get (), NULL
));
655 if (member_bfd
== NULL
)
657 warning (_("Could not read archive members out of "
658 "OSO archive \"%s\""), archive_name
.c_str ());
663 /* Load all oso in this library. */
664 while (member_bfd
!= NULL
)
666 const char *member_name
= bfd_get_filename (member_bfd
.get ());
667 int member_len
= strlen (member_name
);
669 /* If this member is referenced, add it as a symfile. */
670 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
672 oso2
= &(*oso_vector_ptr
)[ix2
];
675 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
676 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
679 macho_add_oso_symfile (oso2
, member_bfd
,
680 bfd_get_filename (member_bfd
.get ()),
681 main_objfile
, symfile_flags
);
687 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
.get (),
690 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
692 oso2
= &(*oso_vector_ptr
)[ix2
];
694 if (oso2
->name
!= NULL
)
695 warning (_("Could not find specified archive member "
696 "for OSO name \"%s\""), oso
->name
);
702 gdb_bfd_ref_ptr
abfd (gdb_bfd_open (oso
->name
, gnutarget
));
704 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
705 bfd_errmsg (bfd_get_error ()));
707 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
715 /* DSYM (debug symbols) files contain the debug info of an executable.
716 This is a separate file created by dsymutil(1) and is similar to debug
718 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
719 executable name and the executable base name to get the DSYM file name. */
720 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
722 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
723 and return *FILENAMEP with its original filename.
724 Return NULL if no valid dsym file is found (FILENAMEP is not used in
727 static gdb_bfd_ref_ptr
728 macho_check_dsym (struct objfile
*objfile
, std::string
*filenamep
)
730 size_t name_len
= strlen (objfile_name (objfile
));
731 size_t dsym_len
= strlen (DSYM_SUFFIX
);
732 const char *base_name
= lbasename (objfile_name (objfile
));
733 size_t base_len
= strlen (base_name
);
734 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
735 bfd_mach_o_load_command
*main_uuid
;
736 bfd_mach_o_load_command
*dsym_uuid
;
738 strcpy (dsym_filename
, objfile_name (objfile
));
739 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
740 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
742 if (access (dsym_filename
, R_OK
) != 0)
745 if (bfd_mach_o_lookup_command (objfile
->obfd
.get (),
746 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
748 warning (_("can't find UUID in %s"), objfile_name (objfile
));
751 gdb_bfd_ref_ptr
dsym_bfd (gdb_bfd_openr (dsym_filename
, gnutarget
));
752 if (dsym_bfd
== NULL
)
754 warning (_("can't open dsym file %s"), dsym_filename
);
758 if (!bfd_check_format (dsym_bfd
.get (), bfd_object
))
760 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
764 if (bfd_mach_o_lookup_command (dsym_bfd
.get (),
765 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
767 warning (_("can't find UUID in %s"), dsym_filename
);
770 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
771 sizeof (main_uuid
->command
.uuid
.uuid
)))
773 warning (_("dsym file UUID doesn't match the one in %s"),
774 objfile_name (objfile
));
777 *filenamep
= std::string (dsym_filename
);
782 macho_symfile_read (struct objfile
*objfile
, symfile_add_flags symfile_flags
)
784 bfd
*abfd
= objfile
->obfd
.get ();
786 std::vector
<oso_el
> oso_vector
;
787 /* We have to hold on to the symbol table until the call to
788 macho_symfile_read_all_oso at the end of this function. */
789 gdb::def_vector
<asymbol
*> symbol_table
;
791 /* Get symbols from the symbol table only if the file is an executable.
792 The symbol table of object files is not relocated and is expected to
793 be in the executable. */
794 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
796 std::string dsym_filename
;
798 /* Process the normal symbol table first. */
799 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
.get ());
800 if (storage_needed
< 0)
801 error (_("Can't read symbols from %s: %s"),
802 bfd_get_filename (objfile
->obfd
.get ()),
803 bfd_errmsg (bfd_get_error ()));
805 if (storage_needed
> 0)
809 symbol_table
.resize (storage_needed
/ sizeof (asymbol
*));
811 minimal_symbol_reader
reader (objfile
);
813 symcount
= bfd_canonicalize_symtab (objfile
->obfd
.get (),
814 symbol_table
.data ());
817 error (_("Can't read symbols from %s: %s"),
818 bfd_get_filename (objfile
->obfd
.get ()),
819 bfd_errmsg (bfd_get_error ()));
821 macho_symtab_read (reader
, objfile
, symcount
, symbol_table
.data (),
827 /* Try to read .eh_frame / .debug_frame. */
828 /* First, locate these sections. We ignore the result status
829 as it only checks for debug info. */
830 dwarf2_has_info (objfile
, NULL
);
831 dwarf2_build_frame_info (objfile
);
833 /* Check for DSYM file. */
834 gdb_bfd_ref_ptr
dsym_bfd (macho_check_dsym (objfile
, &dsym_filename
));
835 if (dsym_bfd
!= NULL
)
837 struct bfd_section
*asect
, *dsect
;
839 macho_debug (0, _("dsym file found\n"));
841 /* Set dsym section size. */
842 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
844 asect
= asect
->next
, dsect
= dsect
->next
)
846 if (strcmp (asect
->name
, dsect
->name
) != 0)
848 bfd_set_section_size (dsect
, bfd_section_size (asect
));
851 /* Add the dsym file as a separate file. */
852 symbol_file_add_separate (dsym_bfd
, dsym_filename
.c_str (),
853 symfile_flags
, objfile
);
855 /* Don't try to read dwarf2 from main file or shared libraries. */
860 if (dwarf2_has_info (objfile
, NULL
))
862 /* DWARF 2 sections */
863 dwarf2_initialize_objfile (objfile
);
867 if (!oso_vector
.empty ())
868 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
872 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
875 bfd
*abfd
= objfile
->obfd
.get ();
877 /* We're only interested in sections with relocation
879 if ((sectp
->flags
& SEC_RELOC
) == 0)
882 macho_debug (0, _("Relocate section '%s' of %s\n"),
883 sectp
->name
, objfile_name (objfile
));
885 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
889 macho_symfile_finish (struct objfile
*objfile
)
894 macho_symfile_offsets (struct objfile
*objfile
,
895 const section_addr_info
&addrs
)
898 struct obj_section
*osect
;
900 /* Allocate section_offsets. */
901 objfile
->section_offsets
.assign (gdb_bfd_count_sections (objfile
->obfd
.get ()), 0);
903 /* This code is run when we first add the objfile with
904 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
905 passed in. The place in symfile.c where the addrs are applied
906 depends on the addrs having section names. But in the dyld code
907 we build an anonymous array of addrs, so that code is a no-op.
908 Because of that, we have to apply the addrs to the sections here.
909 N.B. if an objfile slides after we've already created it, then it
910 goes through objfile_relocate. */
912 for (i
= 0; i
< addrs
.size (); i
++)
914 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
916 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
918 if (bfd_sect_name
== addrs
[i
].name
)
920 osect
->set_offset (addrs
[i
].addr
);
926 objfile
->sect_index_text
= 0;
928 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
930 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
931 int sect_index
= osect
- objfile
->sections
;;
933 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
935 if (strcmp (bfd_sect_name
, "__TEXT") == 0
936 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
937 objfile
->sect_index_text
= sect_index
;
941 static const struct sym_fns macho_sym_fns
= {
942 macho_new_init
, /* init anything gbl to entire symtab */
943 macho_symfile_init
, /* read initial info, setup for sym_read() */
944 macho_symfile_read
, /* read a symbol file into symtab */
945 macho_symfile_finish
, /* finished with file, cleanup */
946 macho_symfile_offsets
, /* xlate external to internal form */
947 default_symfile_segments
, /* Get segment information from a file. */
949 macho_symfile_relocate
, /* Relocate a debug section. */
950 NULL
, /* sym_get_probes */
953 void _initialize_machoread ();
955 _initialize_machoread ()
957 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
959 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
961 _("Set if printing Mach-O symbols processing."),
962 _("Show if printing Mach-O symbols processing."),
964 &setdebuglist
, &showdebuglist
);