1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2020 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"
36 /* If non-zero displays debugging message. */
37 static unsigned int mach_o_debug_level
= 0;
39 /* Dwarf debugging information are never in the final executable. They stay
40 in object files and the executable contains the list of object files read
42 Each time an oso (other source) is found in the executable, the reader
43 creates such a structure. They are read after the processing of the
48 oso_el (asymbol
**oso_sym_
, asymbol
**end_sym_
, unsigned int nbr_syms_
)
49 : name((*oso_sym_
)->name
),
50 mtime((*oso_sym_
)->value
),
57 /* Object file name. Can also be a member name. */
60 /* Associated time stamp. */
63 /* Stab symbols range for this OSO. */
67 /* Number of interesting stabs in the range. */
68 unsigned int nbr_syms
;
72 macho_new_init (struct objfile
*objfile
)
77 macho_symfile_init (struct objfile
*objfile
)
79 objfile
->flags
|= OBJF_REORDERED
;
82 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
85 macho_symtab_add_minsym (minimal_symbol_reader
&reader
,
86 struct objfile
*objfile
, const asymbol
*sym
)
88 if (sym
->name
== NULL
|| *sym
->name
== '\0')
90 /* Skip names that don't exist (shouldn't happen), or names
91 that are null strings (may happen). */
95 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
98 enum minimal_symbol_type ms_type
;
100 /* Bfd symbols are section relative. */
101 symaddr
= sym
->value
+ sym
->section
->vma
;
103 if (sym
->section
== bfd_abs_section_ptr
)
105 else if (sym
->section
->flags
& SEC_CODE
)
107 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
110 ms_type
= mst_file_text
;
112 else if (sym
->section
->flags
& SEC_ALLOC
)
114 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
116 if (sym
->section
->flags
& SEC_LOAD
)
121 else if (sym
->flags
& BSF_LOCAL
)
123 /* Not a special stabs-in-elf symbol, do regular
124 symbol processing. */
125 if (sym
->section
->flags
& SEC_LOAD
)
126 ms_type
= mst_file_data
;
128 ms_type
= mst_file_bss
;
131 ms_type
= mst_unknown
;
134 return; /* Skip this symbol. */
136 reader
.record_with_info (sym
->name
, symaddr
, ms_type
,
137 gdb_bfd_section_index (objfile
->obfd
,
142 /* Build the minimal symbol table from SYMBOL_TABLE of length
143 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
146 macho_symtab_read (minimal_symbol_reader
&reader
,
147 struct objfile
*objfile
,
148 long number_of_symbols
, asymbol
**symbol_table
,
149 std::vector
<oso_el
> *oso_vector_ptr
)
152 const asymbol
*file_so
= NULL
;
153 asymbol
**oso_file
= NULL
;
154 unsigned int nbr_syms
= 0;
156 /* Current state while reading stabs. */
159 /* Not within an SO part. Only non-debugging symbols should be present,
160 and will be added to the minimal symbols table. */
163 /* First SO read. Introduce an SO section, and may be followed by a second
164 SO. The SO section should contain onl debugging symbols. */
167 /* Second non-null SO found, just after the first one. Means that the first
168 is in fact a directory name. */
171 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
177 for (i
= 0; i
< number_of_symbols
; i
++)
179 const asymbol
*sym
= symbol_table
[i
];
180 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
185 if (mach_o_sym
->n_type
== N_SO
)
187 /* Start of object stab. */
188 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
190 /* Unexpected empty N_SO. */
191 complaint (_("Unexpected empty N_SO stab"));
199 else if (sym
->flags
& BSF_DEBUGGING
)
201 if (mach_o_sym
->n_type
== N_OPT
)
203 /* No complaint for OPT. */
207 /* Debugging symbols are not expected here. */
208 complaint (_("%s: Unexpected debug stab outside SO markers"),
209 objfile_name (objfile
));
213 /* Non-debugging symbols go to the minimal symbol table. */
214 macho_symtab_add_minsym (reader
, objfile
, sym
);
220 if (mach_o_sym
->n_type
== N_SO
)
222 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
224 /* Unexpected empty N_SO. */
225 complaint (_("Empty SO section"));
228 else if (state
== S_FIRST_SO
)
230 /* Second SO stab for the file name. */
235 complaint (_("Three SO in a raw"));
237 else if (mach_o_sym
->n_type
== N_OSO
)
239 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
241 /* Empty OSO. Means that this file was compiled with
244 warning (_("stabs debugging not supported for %s"),
249 /* Non-empty OSO for a Dwarf file. */
250 oso_file
= symbol_table
+ i
;
252 state
= S_DWARF_FILE
;
256 complaint (_("Unexpected stab after SO"));
261 if (mach_o_sym
->n_type
== N_SO
)
263 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
266 if (state
== S_DWARF_FILE
)
267 oso_vector_ptr
->emplace_back (oso_file
, symbol_table
+ i
,
273 complaint (_("Missing nul SO"));
278 else if (sym
->flags
& BSF_DEBUGGING
)
280 if (state
== S_STAB_FILE
)
282 /* FIXME: to be implemented. */
286 switch (mach_o_sym
->n_type
)
289 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
293 /* Interesting symbol. */
301 complaint (_("unhandled stab for dwarf OSO file"));
307 complaint (_("non-debugging symbol within SO"));
312 if (state
!= S_NO_SO
)
313 complaint (_("missing nul SO"));
316 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
317 returns the length of the archive name.
318 Returns -1 otherwise. */
321 get_archive_prefix_len (const char *name
)
324 int name_len
= strlen (name
);
326 if (name_len
== 0 || name
[name_len
- 1] != ')')
329 lparen
= strrchr (name
, '(');
330 if (lparen
== NULL
|| lparen
== name
)
332 return lparen
- name
;
335 /* Compare function to std::sort OSOs, so that members of a library
339 oso_el_compare_name (const oso_el
&l
, const oso_el
&r
)
341 return strcmp (l
.name
, r
.name
) < 0;
344 /* Hash table entry structure for the stabs symbols in the main object file.
345 This is used to speed up lookup for symbols in the OSO. */
347 struct macho_sym_hash_entry
349 struct bfd_hash_entry base
;
353 /* Routine to create an entry in the hash table. */
355 static struct bfd_hash_entry
*
356 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
357 struct bfd_hash_table
*table
,
360 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
362 /* Allocate the structure if it has not already been allocated by a
365 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
370 /* Call the allocation method of the superclass. */
371 ret
= (struct macho_sym_hash_entry
*)
372 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
376 /* Initialize the local fields. */
380 return (struct bfd_hash_entry
*) ret
;
383 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
384 to get the value of global and common symbols. */
387 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
389 /* For common symbol and global symbols, use the min symtab. */
390 struct bound_minimal_symbol msym
;
391 const char *name
= sym
->name
;
393 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
395 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
396 if (msym
.minsym
== NULL
)
398 warning (_("can't find symbol '%s' in minsymtab"), name
);
402 return BMSYMBOL_VALUE_ADDRESS (msym
);
405 /* Add oso file OSO/ABFD as a symbol file. */
408 macho_add_oso_symfile (oso_el
*oso
, const gdb_bfd_ref_ptr
&abfd
,
410 struct objfile
*main_objfile
,
411 symfile_add_flags symfile_flags
)
415 asymbol
**symbol_table
;
417 struct bfd_hash_table table
;
420 /* Per section flag to mark which section have been rebased. */
421 unsigned char *sections_rebased
;
423 if (mach_o_debug_level
> 0)
425 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
427 if (!bfd_check_format (abfd
.get (), bfd_object
))
429 warning (_("`%s': can't read symbols: %s."), oso
->name
,
430 bfd_errmsg (bfd_get_error ()));
434 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
.get ()))
436 warning (_("`%s': file time stamp mismatch."), oso
->name
);
440 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
441 sizeof (struct macho_sym_hash_entry
),
444 warning (_("`%s': can't create hash table"), oso
->name
);
448 bfd_set_cacheable (abfd
.get (), 1);
450 /* Read symbols table. */
451 storage
= bfd_get_symtab_upper_bound (abfd
.get ());
452 symbol_table
= (asymbol
**) xmalloc (storage
);
453 bfd_canonicalize_symtab (abfd
.get (), symbol_table
);
455 /* Init section flags. */
456 nbr_sections
= bfd_count_sections (abfd
.get ());
457 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
458 for (i
= 0; i
< nbr_sections
; i
++)
459 sections_rebased
[i
] = 0;
461 /* Put symbols for the OSO file in the hash table. */
462 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
464 const asymbol
*sym
= *symp
;
465 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
467 switch (mach_o_sym
->n_type
)
475 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
486 struct macho_sym_hash_entry
*ent
;
488 ent
= (struct macho_sym_hash_entry
*)
489 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
490 if (ent
->sym
!= NULL
)
491 complaint (_("Duplicated symbol %s in symbol table"), sym
->name
);
494 if (mach_o_debug_level
> 4)
496 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
498 (_("Adding symbol %s (addr: %s)\n"),
499 sym
->name
, paddress (arch
, sym
->value
));
506 /* Relocate symbols of the OSO. */
507 for (i
= 0; symbol_table
[i
]; i
++)
509 asymbol
*sym
= symbol_table
[i
];
510 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
512 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
514 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
517 /* For common symbol use the min symtab and modify the OSO
521 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
524 sym
->section
= bfd_com_section_ptr
;
528 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
531 asection
*sec
= sym
->section
;
532 bfd_mach_o_section
*msec
;
533 unsigned int sec_type
;
535 /* Skip buggy ones. */
536 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
539 /* Only consider regular, non-debugging sections. */
540 msec
= bfd_mach_o_get_mach_o_section (sec
);
541 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
542 if ((sec_type
== BFD_MACH_O_S_REGULAR
543 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
544 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
548 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
550 /* Use the min symtab for global symbols. */
551 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
555 struct macho_sym_hash_entry
*ent
;
557 ent
= (struct macho_sym_hash_entry
*)
558 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
560 addr
= bfd_asymbol_value (ent
->sym
);
563 /* Adjust the section. */
566 CORE_ADDR res
= addr
- sym
->value
;
568 if (mach_o_debug_level
> 3)
570 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
572 (_("resolve sect %s with %s (set to %s)\n"),
573 sec
->name
, sym
->name
,
574 paddress (arch
, res
));
576 bfd_set_section_vma (sec
, res
);
577 sections_rebased
[sec
->index
] = 1;
582 /* Mark the section as never rebased. */
583 sections_rebased
[sec
->index
] = 2;
588 bfd_hash_table_free (&table
);
590 /* We need to clear SYMFILE_MAINLINE to avoid interactive question
591 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
592 symbol_file_add_from_bfd
593 (abfd
.get (), name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
),
595 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
596 | OBJF_READNOW
| OBJF_USERLOADED
),
600 /* Read symbols from the vector of oso files.
602 Note that this function sorts OSO_VECTOR_PTR. */
605 macho_symfile_read_all_oso (std::vector
<oso_el
> *oso_vector_ptr
,
606 struct objfile
*main_objfile
,
607 symfile_add_flags symfile_flags
)
612 /* Sort oso by name so that files from libraries are gathered. */
613 std::sort (oso_vector_ptr
->begin (), oso_vector_ptr
->end (),
614 oso_el_compare_name
);
616 for (ix
= 0; ix
< oso_vector_ptr
->size ();)
620 oso
= &(*oso_vector_ptr
)[ix
];
622 /* Check if this is a library name. */
623 pfx_len
= get_archive_prefix_len (oso
->name
);
630 std::string
archive_name (oso
->name
, pfx_len
);
632 /* Compute number of oso for this archive. */
633 for (last_ix
= ix
; last_ix
< oso_vector_ptr
->size (); last_ix
++)
635 oso2
= &(*oso_vector_ptr
)[last_ix
];
636 if (strncmp (oso2
->name
, archive_name
.c_str (), pfx_len
) != 0)
640 /* Open the archive and check the format. */
641 gdb_bfd_ref_ptr
archive_bfd (gdb_bfd_open (archive_name
.c_str (),
643 if (archive_bfd
== NULL
)
645 warning (_("Could not open OSO archive file \"%s\""),
646 archive_name
.c_str ());
650 if (!bfd_check_format (archive_bfd
.get (), bfd_archive
))
652 warning (_("OSO archive file \"%s\" not an archive."),
653 archive_name
.c_str ());
658 gdb_bfd_ref_ptr member_bfd
659 (gdb_bfd_openr_next_archived_file (archive_bfd
.get (), NULL
));
661 if (member_bfd
== NULL
)
663 warning (_("Could not read archive members out of "
664 "OSO archive \"%s\""), archive_name
.c_str ());
669 /* Load all oso in this library. */
670 while (member_bfd
!= NULL
)
672 const char *member_name
= bfd_get_filename (member_bfd
.get ());
673 int member_len
= strlen (member_name
);
675 /* If this member is referenced, add it as a symfile. */
676 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
678 oso2
= &(*oso_vector_ptr
)[ix2
];
681 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
682 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
685 macho_add_oso_symfile (oso2
, member_bfd
,
686 bfd_get_filename (member_bfd
.get ()),
687 main_objfile
, symfile_flags
);
693 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
.get (),
696 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
698 oso2
= &(*oso_vector_ptr
)[ix2
];
700 if (oso2
->name
!= NULL
)
701 warning (_("Could not find specified archive member "
702 "for OSO name \"%s\""), oso
->name
);
708 gdb_bfd_ref_ptr
abfd (gdb_bfd_open (oso
->name
, gnutarget
, -1));
710 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
711 bfd_errmsg (bfd_get_error ()));
713 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
721 /* DSYM (debug symbols) files contain the debug info of an executable.
722 This is a separate file created by dsymutil(1) and is similar to debug
724 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
725 executable name and the executable base name to get the DSYM file name. */
726 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
728 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
729 and return *FILENAMEP with its original filename.
730 Return NULL if no valid dsym file is found (FILENAMEP is not used in
733 static gdb_bfd_ref_ptr
734 macho_check_dsym (struct objfile
*objfile
, std::string
*filenamep
)
736 size_t name_len
= strlen (objfile_name (objfile
));
737 size_t dsym_len
= strlen (DSYM_SUFFIX
);
738 const char *base_name
= lbasename (objfile_name (objfile
));
739 size_t base_len
= strlen (base_name
);
740 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
741 bfd_mach_o_load_command
*main_uuid
;
742 bfd_mach_o_load_command
*dsym_uuid
;
744 strcpy (dsym_filename
, objfile_name (objfile
));
745 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
746 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
748 if (access (dsym_filename
, R_OK
) != 0)
751 if (bfd_mach_o_lookup_command (objfile
->obfd
,
752 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
754 warning (_("can't find UUID in %s"), objfile_name (objfile
));
757 gdb_bfd_ref_ptr
dsym_bfd (gdb_bfd_openr (dsym_filename
, gnutarget
));
758 if (dsym_bfd
== NULL
)
760 warning (_("can't open dsym file %s"), dsym_filename
);
764 if (!bfd_check_format (dsym_bfd
.get (), bfd_object
))
766 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
770 if (bfd_mach_o_lookup_command (dsym_bfd
.get (),
771 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
773 warning (_("can't find UUID in %s"), dsym_filename
);
776 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
777 sizeof (main_uuid
->command
.uuid
.uuid
)))
779 warning (_("dsym file UUID doesn't match the one in %s"),
780 objfile_name (objfile
));
783 *filenamep
= std::string (dsym_filename
);
788 macho_symfile_read (struct objfile
*objfile
, symfile_add_flags symfile_flags
)
790 bfd
*abfd
= objfile
->obfd
;
792 std::vector
<oso_el
> oso_vector
;
793 /* We have to hold on to the symbol table until the call to
794 macho_symfile_read_all_oso at the end of this function. */
795 gdb::def_vector
<asymbol
*> symbol_table
;
797 /* Get symbols from the symbol table only if the file is an executable.
798 The symbol table of object files is not relocated and is expected to
799 be in the executable. */
800 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
802 std::string dsym_filename
;
804 /* Process the normal symbol table first. */
805 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
806 if (storage_needed
< 0)
807 error (_("Can't read symbols from %s: %s"),
808 bfd_get_filename (objfile
->obfd
),
809 bfd_errmsg (bfd_get_error ()));
811 if (storage_needed
> 0)
815 symbol_table
.resize (storage_needed
/ sizeof (asymbol
*));
817 minimal_symbol_reader
reader (objfile
);
819 symcount
= bfd_canonicalize_symtab (objfile
->obfd
,
820 symbol_table
.data ());
823 error (_("Can't read symbols from %s: %s"),
824 bfd_get_filename (objfile
->obfd
),
825 bfd_errmsg (bfd_get_error ()));
827 macho_symtab_read (reader
, objfile
, symcount
, symbol_table
.data (),
833 /* Try to read .eh_frame / .debug_frame. */
834 /* First, locate these sections. We ignore the result status
835 as it only checks for debug info. */
836 dwarf2_has_info (objfile
, NULL
);
837 dwarf2_build_frame_info (objfile
);
839 /* Check for DSYM file. */
840 gdb_bfd_ref_ptr
dsym_bfd (macho_check_dsym (objfile
, &dsym_filename
));
841 if (dsym_bfd
!= NULL
)
843 struct bfd_section
*asect
, *dsect
;
845 if (mach_o_debug_level
> 0)
846 printf_unfiltered (_("dsym file found\n"));
848 /* Set dsym section size. */
849 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
851 asect
= asect
->next
, dsect
= dsect
->next
)
853 if (strcmp (asect
->name
, dsect
->name
) != 0)
855 bfd_set_section_size (dsect
, bfd_section_size (asect
));
858 /* Add the dsym file as a separate file. */
859 symbol_file_add_separate (dsym_bfd
.get (), dsym_filename
.c_str (),
860 symfile_flags
, objfile
);
862 /* Don't try to read dwarf2 from main file or shared libraries. */
867 if (dwarf2_has_info (objfile
, NULL
))
869 /* DWARF 2 sections */
870 dwarf2_build_psymtabs (objfile
);
874 if (!oso_vector
.empty ())
875 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
879 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
882 bfd
*abfd
= objfile
->obfd
;
884 /* We're only interested in sections with relocation
886 if ((sectp
->flags
& SEC_RELOC
) == 0)
889 if (mach_o_debug_level
> 0)
890 printf_unfiltered (_("Relocate section '%s' of %s\n"),
891 sectp
->name
, objfile_name (objfile
));
893 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
897 macho_symfile_finish (struct objfile
*objfile
)
902 macho_symfile_offsets (struct objfile
*objfile
,
903 const section_addr_info
&addrs
)
906 struct obj_section
*osect
;
908 /* Allocate section_offsets. */
909 objfile
->section_offsets
.assign (bfd_count_sections (objfile
->obfd
), 0);
911 /* This code is run when we first add the objfile with
912 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
913 passed in. The place in symfile.c where the addrs are applied
914 depends on the addrs having section names. But in the dyld code
915 we build an anonymous array of addrs, so that code is a no-op.
916 Because of that, we have to apply the addrs to the sections here.
917 N.B. if an objfile slides after we've already created it, then it
918 goes through objfile_relocate. */
920 for (i
= 0; i
< addrs
.size (); i
++)
922 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
924 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
926 if (bfd_sect_name
== addrs
[i
].name
)
928 obj_section_offset (osect
) = addrs
[i
].addr
;
934 objfile
->sect_index_text
= 0;
936 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
938 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
939 int sect_index
= osect
- objfile
->sections
;;
941 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
943 if (strcmp (bfd_sect_name
, "__TEXT") == 0
944 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
945 objfile
->sect_index_text
= sect_index
;
949 static const struct sym_fns macho_sym_fns
= {
950 macho_new_init
, /* init anything gbl to entire symtab */
951 macho_symfile_init
, /* read initial info, setup for sym_read() */
952 macho_symfile_read
, /* read a symbol file into symtab */
953 NULL
, /* sym_read_psymbols */
954 macho_symfile_finish
, /* finished with file, cleanup */
955 macho_symfile_offsets
, /* xlate external to internal form */
956 default_symfile_segments
, /* Get segment information from a file. */
958 macho_symfile_relocate
, /* Relocate a debug section. */
959 NULL
, /* sym_get_probes */
963 void _initialize_machoread ();
965 _initialize_machoread ()
967 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
969 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
971 _("Set if printing Mach-O symbols processing."),
972 _("Show if printing Mach-O symbols processing."),
974 &setdebuglist
, &showdebuglist
);