1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2019 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"
32 #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 oso_el (asymbol
**oso_sym_
, asymbol
**end_sym_
, unsigned int nbr_syms_
)
50 : name((*oso_sym_
)->name
),
51 mtime((*oso_sym_
)->value
),
58 /* Object file name. Can also be a member name. */
61 /* Associated time stamp. */
64 /* Stab symbols range for this OSO. */
68 /* Number of interesting stabs in the range. */
69 unsigned int nbr_syms
;
73 macho_new_init (struct objfile
*objfile
)
78 macho_symfile_init (struct objfile
*objfile
)
80 objfile
->flags
|= OBJF_REORDERED
;
83 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
86 macho_symtab_add_minsym (minimal_symbol_reader
&reader
,
87 struct objfile
*objfile
, const asymbol
*sym
)
89 if (sym
->name
== NULL
|| *sym
->name
== '\0')
91 /* Skip names that don't exist (shouldn't happen), or names
92 that are null strings (may happen). */
96 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
99 enum minimal_symbol_type ms_type
;
101 /* Bfd symbols are section relative. */
102 symaddr
= sym
->value
+ sym
->section
->vma
;
104 if (sym
->section
== bfd_abs_section_ptr
)
106 else if (sym
->section
->flags
& SEC_CODE
)
108 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
111 ms_type
= mst_file_text
;
113 else if (sym
->section
->flags
& SEC_ALLOC
)
115 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
117 if (sym
->section
->flags
& SEC_LOAD
)
122 else if (sym
->flags
& BSF_LOCAL
)
124 /* Not a special stabs-in-elf symbol, do regular
125 symbol processing. */
126 if (sym
->section
->flags
& SEC_LOAD
)
127 ms_type
= mst_file_data
;
129 ms_type
= mst_file_bss
;
132 ms_type
= mst_unknown
;
135 return; /* Skip this symbol. */
137 reader
.record_with_info (sym
->name
, symaddr
, ms_type
,
138 gdb_bfd_section_index (objfile
->obfd
,
143 /* Build the minimal symbol table from SYMBOL_TABLE of length
144 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
147 macho_symtab_read (minimal_symbol_reader
&reader
,
148 struct objfile
*objfile
,
149 long number_of_symbols
, asymbol
**symbol_table
,
150 std::vector
<oso_el
> *oso_vector_ptr
)
153 const asymbol
*file_so
= NULL
;
154 asymbol
**oso_file
= NULL
;
155 unsigned int nbr_syms
= 0;
157 /* Current state while reading stabs. */
160 /* Not within an SO part. Only non-debugging symbols should be present,
161 and will be added to the minimal symbols table. */
164 /* First SO read. Introduce an SO section, and may be followed by a second
165 SO. The SO section should contain onl debugging symbols. */
168 /* Second non-null SO found, just after the first one. Means that the first
169 is in fact a directory name. */
172 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
178 for (i
= 0; i
< number_of_symbols
; i
++)
180 const asymbol
*sym
= symbol_table
[i
];
181 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
186 if (mach_o_sym
->n_type
== N_SO
)
188 /* Start of object stab. */
189 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
191 /* Unexpected empty N_SO. */
192 complaint (_("Unexpected empty N_SO stab"));
200 else if (sym
->flags
& BSF_DEBUGGING
)
202 if (mach_o_sym
->n_type
== N_OPT
)
204 /* No complaint for OPT. */
208 /* Debugging symbols are not expected here. */
209 complaint (_("%s: Unexpected debug stab outside SO markers"),
210 objfile_name (objfile
));
214 /* Non-debugging symbols go to the minimal symbol table. */
215 macho_symtab_add_minsym (reader
, objfile
, sym
);
221 if (mach_o_sym
->n_type
== N_SO
)
223 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
225 /* Unexpected empty N_SO. */
226 complaint (_("Empty SO section"));
229 else if (state
== S_FIRST_SO
)
231 /* Second SO stab for the file name. */
236 complaint (_("Three SO in a raw"));
238 else if (mach_o_sym
->n_type
== N_OSO
)
240 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
242 /* Empty OSO. Means that this file was compiled with
245 warning (_("stabs debugging not supported for %s"),
250 /* Non-empty OSO for a Dwarf file. */
251 oso_file
= symbol_table
+ i
;
253 state
= S_DWARF_FILE
;
257 complaint (_("Unexpected stab after SO"));
262 if (mach_o_sym
->n_type
== N_SO
)
264 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
267 if (state
== S_DWARF_FILE
)
268 oso_vector_ptr
->emplace_back (oso_file
, symbol_table
+ i
,
274 complaint (_("Missing nul SO"));
279 else if (sym
->flags
& BSF_DEBUGGING
)
281 if (state
== S_STAB_FILE
)
283 /* FIXME: to be implemented. */
287 switch (mach_o_sym
->n_type
)
290 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
294 /* Interesting symbol. */
302 complaint (_("unhandled stab for dwarf OSO file"));
308 complaint (_("non-debugging symbol within SO"));
313 if (state
!= S_NO_SO
)
314 complaint (_("missing nul SO"));
317 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
318 returns the length of the archive name.
319 Returns -1 otherwise. */
322 get_archive_prefix_len (const char *name
)
325 int name_len
= strlen (name
);
327 if (name_len
== 0 || name
[name_len
- 1] != ')')
330 lparen
= strrchr (name
, '(');
331 if (lparen
== NULL
|| lparen
== name
)
333 return lparen
- name
;
336 /* Compare function to std::sort OSOs, so that members of a library
340 oso_el_compare_name (const oso_el
&l
, const oso_el
&r
)
342 return strcmp (l
.name
, r
.name
) < 0;
345 /* Hash table entry structure for the stabs symbols in the main object file.
346 This is used to speed up lookup for symbols in the OSO. */
348 struct macho_sym_hash_entry
350 struct bfd_hash_entry base
;
354 /* Routine to create an entry in the hash table. */
356 static struct bfd_hash_entry
*
357 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
358 struct bfd_hash_table
*table
,
361 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
363 /* Allocate the structure if it has not already been allocated by a
366 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
371 /* Call the allocation method of the superclass. */
372 ret
= (struct macho_sym_hash_entry
*)
373 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
377 /* Initialize the local fields. */
381 return (struct bfd_hash_entry
*) ret
;
384 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
385 to get the value of global and common symbols. */
388 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
390 /* For common symbol and global symbols, use the min symtab. */
391 struct bound_minimal_symbol msym
;
392 const char *name
= sym
->name
;
394 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
396 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
397 if (msym
.minsym
== NULL
)
399 warning (_("can't find symbol '%s' in minsymtab"), name
);
403 return BMSYMBOL_VALUE_ADDRESS (msym
);
406 /* Add oso file OSO/ABFD as a symbol file. */
409 macho_add_oso_symfile (oso_el
*oso
, const gdb_bfd_ref_ptr
&abfd
,
411 struct objfile
*main_objfile
,
412 symfile_add_flags symfile_flags
)
416 asymbol
**symbol_table
;
418 struct bfd_hash_table table
;
421 /* Per section flag to mark which section have been rebased. */
422 unsigned char *sections_rebased
;
424 if (mach_o_debug_level
> 0)
426 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
428 if (!bfd_check_format (abfd
.get (), bfd_object
))
430 warning (_("`%s': can't read symbols: %s."), oso
->name
,
431 bfd_errmsg (bfd_get_error ()));
435 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
.get ()))
437 warning (_("`%s': file time stamp mismatch."), oso
->name
);
441 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
442 sizeof (struct macho_sym_hash_entry
),
445 warning (_("`%s': can't create hash table"), oso
->name
);
449 bfd_set_cacheable (abfd
.get (), 1);
451 /* Read symbols table. */
452 storage
= bfd_get_symtab_upper_bound (abfd
.get ());
453 symbol_table
= (asymbol
**) xmalloc (storage
);
454 bfd_canonicalize_symtab (abfd
.get (), symbol_table
);
456 /* Init section flags. */
457 nbr_sections
= bfd_count_sections (abfd
.get ());
458 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
459 for (i
= 0; i
< nbr_sections
; i
++)
460 sections_rebased
[i
] = 0;
462 /* Put symbols for the OSO file in the hash table. */
463 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
465 const asymbol
*sym
= *symp
;
466 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
468 switch (mach_o_sym
->n_type
)
476 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
487 struct macho_sym_hash_entry
*ent
;
489 ent
= (struct macho_sym_hash_entry
*)
490 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
491 if (ent
->sym
!= NULL
)
492 complaint (_("Duplicated symbol %s in symbol table"), sym
->name
);
495 if (mach_o_debug_level
> 4)
497 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
499 (_("Adding symbol %s (addr: %s)\n"),
500 sym
->name
, paddress (arch
, sym
->value
));
507 /* Relocate symbols of the OSO. */
508 for (i
= 0; symbol_table
[i
]; i
++)
510 asymbol
*sym
= symbol_table
[i
];
511 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
513 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
515 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
518 /* For common symbol use the min symtab and modify the OSO
522 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
525 sym
->section
= bfd_com_section_ptr
;
529 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
532 asection
*sec
= sym
->section
;
533 bfd_mach_o_section
*msec
;
534 unsigned int sec_type
;
536 /* Skip buggy ones. */
537 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
540 /* Only consider regular, non-debugging sections. */
541 msec
= bfd_mach_o_get_mach_o_section (sec
);
542 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
543 if ((sec_type
== BFD_MACH_O_S_REGULAR
544 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
545 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
549 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
551 /* Use the min symtab for global symbols. */
552 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
556 struct macho_sym_hash_entry
*ent
;
558 ent
= (struct macho_sym_hash_entry
*)
559 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
561 addr
= bfd_asymbol_value (ent
->sym
);
564 /* Adjust the section. */
567 CORE_ADDR res
= addr
- sym
->value
;
569 if (mach_o_debug_level
> 3)
571 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
573 (_("resolve sect %s with %s (set to %s)\n"),
574 sec
->name
, sym
->name
,
575 paddress (arch
, res
));
577 bfd_set_section_vma (sec
, res
);
578 sections_rebased
[sec
->index
] = 1;
583 /* Mark the section as never rebased. */
584 sections_rebased
[sec
->index
] = 2;
589 bfd_hash_table_free (&table
);
591 /* We need to clear SYMFILE_MAINLINE to avoid interactive question
592 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
593 symbol_file_add_from_bfd
594 (abfd
.get (), name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
),
596 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
597 | OBJF_READNOW
| OBJF_USERLOADED
),
601 /* Read symbols from the vector of oso files.
603 Note that this function sorts OSO_VECTOR_PTR. */
606 macho_symfile_read_all_oso (std::vector
<oso_el
> *oso_vector_ptr
,
607 struct objfile
*main_objfile
,
608 symfile_add_flags symfile_flags
)
613 /* Sort oso by name so that files from libraries are gathered. */
614 std::sort (oso_vector_ptr
->begin (), oso_vector_ptr
->end (),
615 oso_el_compare_name
);
617 for (ix
= 0; ix
< oso_vector_ptr
->size ();)
621 oso
= &(*oso_vector_ptr
)[ix
];
623 /* Check if this is a library name. */
624 pfx_len
= get_archive_prefix_len (oso
->name
);
631 std::string
archive_name (oso
->name
, pfx_len
);
633 /* Compute number of oso for this archive. */
634 for (last_ix
= ix
; last_ix
< oso_vector_ptr
->size (); last_ix
++)
636 oso2
= &(*oso_vector_ptr
)[last_ix
];
637 if (strncmp (oso2
->name
, archive_name
.c_str (), pfx_len
) != 0)
641 /* Open the archive and check the format. */
642 gdb_bfd_ref_ptr
archive_bfd (gdb_bfd_open (archive_name
.c_str (),
644 if (archive_bfd
== NULL
)
646 warning (_("Could not open OSO archive file \"%s\""),
647 archive_name
.c_str ());
651 if (!bfd_check_format (archive_bfd
.get (), bfd_archive
))
653 warning (_("OSO archive file \"%s\" not an archive."),
654 archive_name
.c_str ());
659 gdb_bfd_ref_ptr member_bfd
660 (gdb_bfd_openr_next_archived_file (archive_bfd
.get (), NULL
));
662 if (member_bfd
== NULL
)
664 warning (_("Could not read archive members out of "
665 "OSO archive \"%s\""), archive_name
.c_str ());
670 /* Load all oso in this library. */
671 while (member_bfd
!= NULL
)
673 const char *member_name
= bfd_get_filename (member_bfd
.get ());
674 int member_len
= strlen (member_name
);
676 /* If this member is referenced, add it as a symfile. */
677 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
679 oso2
= &(*oso_vector_ptr
)[ix2
];
682 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
683 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
686 macho_add_oso_symfile (oso2
, member_bfd
,
687 bfd_get_filename (member_bfd
.get ()),
688 main_objfile
, symfile_flags
);
694 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
.get (),
697 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
699 oso2
= &(*oso_vector_ptr
)[ix2
];
701 if (oso2
->name
!= NULL
)
702 warning (_("Could not find specified archive member "
703 "for OSO name \"%s\""), oso
->name
);
709 gdb_bfd_ref_ptr
abfd (gdb_bfd_open (oso
->name
, gnutarget
, -1));
711 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
712 bfd_errmsg (bfd_get_error ()));
714 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
722 /* DSYM (debug symbols) files contain the debug info of an executable.
723 This is a separate file created by dsymutil(1) and is similar to debug
725 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
726 executable name and the executable base name to get the DSYM file name. */
727 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
729 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
730 and return *FILENAMEP with its original filename.
731 Return NULL if no valid dsym file is found (FILENAMEP is not used in
734 static gdb_bfd_ref_ptr
735 macho_check_dsym (struct objfile
*objfile
, std::string
*filenamep
)
737 size_t name_len
= strlen (objfile_name (objfile
));
738 size_t dsym_len
= strlen (DSYM_SUFFIX
);
739 const char *base_name
= lbasename (objfile_name (objfile
));
740 size_t base_len
= strlen (base_name
);
741 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
742 bfd_mach_o_load_command
*main_uuid
;
743 bfd_mach_o_load_command
*dsym_uuid
;
745 strcpy (dsym_filename
, objfile_name (objfile
));
746 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
747 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
749 if (access (dsym_filename
, R_OK
) != 0)
752 if (bfd_mach_o_lookup_command (objfile
->obfd
,
753 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
755 warning (_("can't find UUID in %s"), objfile_name (objfile
));
758 gdb_bfd_ref_ptr
dsym_bfd (gdb_bfd_openr (dsym_filename
, gnutarget
));
759 if (dsym_bfd
== NULL
)
761 warning (_("can't open dsym file %s"), dsym_filename
);
765 if (!bfd_check_format (dsym_bfd
.get (), bfd_object
))
767 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
771 if (bfd_mach_o_lookup_command (dsym_bfd
.get (),
772 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
774 warning (_("can't find UUID in %s"), dsym_filename
);
777 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
778 sizeof (main_uuid
->command
.uuid
.uuid
)))
780 warning (_("dsym file UUID doesn't match the one in %s"),
781 objfile_name (objfile
));
784 *filenamep
= std::string (dsym_filename
);
789 macho_symfile_read (struct objfile
*objfile
, symfile_add_flags symfile_flags
)
791 bfd
*abfd
= objfile
->obfd
;
793 std::vector
<oso_el
> oso_vector
;
794 /* We have to hold on to the symbol table until the call to
795 macho_symfile_read_all_oso at the end of this function. */
796 gdb::def_vector
<asymbol
*> symbol_table
;
798 /* Get symbols from the symbol table only if the file is an executable.
799 The symbol table of object files is not relocated and is expected to
800 be in the executable. */
801 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
803 std::string dsym_filename
;
805 /* Process the normal symbol table first. */
806 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
807 if (storage_needed
< 0)
808 error (_("Can't read symbols from %s: %s"),
809 bfd_get_filename (objfile
->obfd
),
810 bfd_errmsg (bfd_get_error ()));
812 if (storage_needed
> 0)
816 symbol_table
.resize (storage_needed
/ sizeof (asymbol
*));
818 minimal_symbol_reader
reader (objfile
);
820 symcount
= bfd_canonicalize_symtab (objfile
->obfd
,
821 symbol_table
.data ());
824 error (_("Can't read symbols from %s: %s"),
825 bfd_get_filename (objfile
->obfd
),
826 bfd_errmsg (bfd_get_error ()));
828 macho_symtab_read (reader
, objfile
, symcount
, symbol_table
.data (),
834 /* Try to read .eh_frame / .debug_frame. */
835 /* First, locate these sections. We ignore the result status
836 as it only checks for debug info. */
837 dwarf2_has_info (objfile
, NULL
);
838 dwarf2_build_frame_info (objfile
);
840 /* Check for DSYM file. */
841 gdb_bfd_ref_ptr
dsym_bfd (macho_check_dsym (objfile
, &dsym_filename
));
842 if (dsym_bfd
!= NULL
)
844 struct bfd_section
*asect
, *dsect
;
846 if (mach_o_debug_level
> 0)
847 printf_unfiltered (_("dsym file found\n"));
849 /* Set dsym section size. */
850 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
852 asect
= asect
->next
, dsect
= dsect
->next
)
854 if (strcmp (asect
->name
, dsect
->name
) != 0)
856 bfd_set_section_size (dsect
, bfd_section_size (asect
));
859 /* Add the dsym file as a separate file. */
860 symbol_file_add_separate (dsym_bfd
.get (), dsym_filename
.c_str (),
861 symfile_flags
, objfile
);
863 /* Don't try to read dwarf2 from main file or shared libraries. */
868 if (dwarf2_has_info (objfile
, NULL
))
870 /* DWARF 2 sections */
871 dwarf2_build_psymtabs (objfile
);
875 if (!oso_vector
.empty ())
876 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
880 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
883 bfd
*abfd
= objfile
->obfd
;
885 /* We're only interested in sections with relocation
887 if ((sectp
->flags
& SEC_RELOC
) == 0)
890 if (mach_o_debug_level
> 0)
891 printf_unfiltered (_("Relocate section '%s' of %s\n"),
892 sectp
->name
, objfile_name (objfile
));
894 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
898 macho_symfile_finish (struct objfile
*objfile
)
903 macho_symfile_offsets (struct objfile
*objfile
,
904 const section_addr_info
&addrs
)
907 struct obj_section
*osect
;
909 /* Allocate section_offsets. */
910 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
911 objfile
->section_offsets
= (struct section_offsets
*)
912 obstack_alloc (&objfile
->objfile_obstack
,
913 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
914 memset (objfile
->section_offsets
, 0,
915 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
917 /* This code is run when we first add the objfile with
918 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
919 passed in. The place in symfile.c where the addrs are applied
920 depends on the addrs having section names. But in the dyld code
921 we build an anonymous array of addrs, so that code is a no-op.
922 Because of that, we have to apply the addrs to the sections here.
923 N.B. if an objfile slides after we've already created it, then it
924 goes through objfile_relocate. */
926 for (i
= 0; i
< addrs
.size (); i
++)
928 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
930 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
932 if (bfd_sect_name
== addrs
[i
].name
)
934 obj_section_offset (osect
) = addrs
[i
].addr
;
940 objfile
->sect_index_text
= 0;
942 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
944 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
945 int sect_index
= osect
- objfile
->sections
;;
947 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
949 if (strcmp (bfd_sect_name
, "__TEXT") == 0
950 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
951 objfile
->sect_index_text
= sect_index
;
955 static const struct sym_fns macho_sym_fns
= {
956 macho_new_init
, /* init anything gbl to entire symtab */
957 macho_symfile_init
, /* read initial info, setup for sym_read() */
958 macho_symfile_read
, /* read a symbol file into symtab */
959 NULL
, /* sym_read_psymbols */
960 macho_symfile_finish
, /* finished with file, cleanup */
961 macho_symfile_offsets
, /* xlate external to internal form */
962 default_symfile_segments
, /* Get segment information from a file. */
964 macho_symfile_relocate
, /* Relocate a debug section. */
965 NULL
, /* sym_get_probes */
970 _initialize_machoread (void)
972 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
974 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
976 _("Set if printing Mach-O symbols processing."),
977 _("Show if printing Mach-O symbols processing."),
979 &setdebuglist
, &showdebuglist
);