1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2018 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"
39 /* If non-zero displays debugging message. */
40 static unsigned int mach_o_debug_level
= 0;
42 /* Dwarf debugging information are never in the final executable. They stay
43 in object files and the executable contains the list of object files read
45 Each time an oso (other source) is found in the executable, the reader
46 creates such a structure. They are read after the processing of the
51 oso_el (asymbol
**oso_sym_
, asymbol
**end_sym_
, unsigned int nbr_syms_
)
52 : name((*oso_sym_
)->name
),
53 mtime((*oso_sym_
)->value
),
60 /* Object file name. Can also be a member name. */
63 /* Associated time stamp. */
66 /* Stab symbols range for this OSO. */
70 /* Number of interesting stabs in the range. */
71 unsigned int nbr_syms
;
75 macho_new_init (struct objfile
*objfile
)
80 macho_symfile_init (struct objfile
*objfile
)
82 objfile
->flags
|= OBJF_REORDERED
;
85 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
88 macho_symtab_add_minsym (minimal_symbol_reader
&reader
,
89 struct objfile
*objfile
, const asymbol
*sym
)
91 if (sym
->name
== NULL
|| *sym
->name
== '\0')
93 /* Skip names that don't exist (shouldn't happen), or names
94 that are null strings (may happen). */
98 if (sym
->flags
& (BSF_GLOBAL
| BSF_LOCAL
| BSF_WEAK
))
101 enum minimal_symbol_type ms_type
;
103 /* Bfd symbols are section relative. */
104 symaddr
= sym
->value
+ sym
->section
->vma
;
106 if (sym
->section
== bfd_abs_section_ptr
)
108 else if (sym
->section
->flags
& SEC_CODE
)
110 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
113 ms_type
= mst_file_text
;
115 else if (sym
->section
->flags
& SEC_ALLOC
)
117 if (sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
))
119 if (sym
->section
->flags
& SEC_LOAD
)
124 else if (sym
->flags
& BSF_LOCAL
)
126 /* Not a special stabs-in-elf symbol, do regular
127 symbol processing. */
128 if (sym
->section
->flags
& SEC_LOAD
)
129 ms_type
= mst_file_data
;
131 ms_type
= mst_file_bss
;
134 ms_type
= mst_unknown
;
137 return; /* Skip this symbol. */
139 reader
.record_with_info (sym
->name
, symaddr
, ms_type
,
140 gdb_bfd_section_index (objfile
->obfd
,
145 /* Build the minimal symbol table from SYMBOL_TABLE of length
146 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
149 macho_symtab_read (minimal_symbol_reader
&reader
,
150 struct objfile
*objfile
,
151 long number_of_symbols
, asymbol
**symbol_table
,
152 std::vector
<oso_el
> *oso_vector_ptr
)
155 const asymbol
*file_so
= NULL
;
156 asymbol
**oso_file
= NULL
;
157 unsigned int nbr_syms
= 0;
159 /* Current state while reading stabs. */
162 /* Not within an SO part. Only non-debugging symbols should be present,
163 and will be added to the minimal symbols table. */
166 /* First SO read. Introduce an SO section, and may be followed by a second
167 SO. The SO section should contain onl debugging symbols. */
170 /* Second non-null SO found, just after the first one. Means that the first
171 is in fact a directory name. */
174 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
180 for (i
= 0; i
< number_of_symbols
; i
++)
182 const asymbol
*sym
= symbol_table
[i
];
183 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
188 if (mach_o_sym
->n_type
== N_SO
)
190 /* Start of object stab. */
191 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
193 /* Unexpected empty N_SO. */
194 complaint (&symfile_complaints
,
195 _("Unexpected empty N_SO stab"));
203 else if (sym
->flags
& BSF_DEBUGGING
)
205 if (mach_o_sym
->n_type
== N_OPT
)
207 /* No complaint for OPT. */
211 /* Debugging symbols are not expected here. */
212 complaint (&symfile_complaints
,
213 _("%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 (&symfile_complaints
, _("Empty SO section"));
233 else if (state
== S_FIRST_SO
)
235 /* Second SO stab for the file name. */
240 complaint (&symfile_complaints
, _("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 (&symfile_complaints
,
262 _("Unexpected stab after SO"));
267 if (mach_o_sym
->n_type
== N_SO
)
269 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
272 if (state
== S_DWARF_FILE
)
273 oso_vector_ptr
->emplace_back (oso_file
, symbol_table
+ i
,
279 complaint (&symfile_complaints
, _("Missing nul SO"));
284 else if (sym
->flags
& BSF_DEBUGGING
)
286 if (state
== S_STAB_FILE
)
288 /* FIXME: to be implemented. */
292 switch (mach_o_sym
->n_type
)
295 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
299 /* Interesting symbol. */
307 complaint (&symfile_complaints
,
308 _("unhandled stab for dwarf OSO file"));
314 complaint (&symfile_complaints
,
315 _("non-debugging symbol within SO"));
320 if (state
!= S_NO_SO
)
321 complaint (&symfile_complaints
, _("missing nul SO"));
324 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
325 returns the length of the archive name.
326 Returns -1 otherwise. */
329 get_archive_prefix_len (const char *name
)
332 int name_len
= strlen (name
);
334 if (name_len
== 0 || name
[name_len
- 1] != ')')
337 lparen
= strrchr (name
, '(');
338 if (lparen
== NULL
|| lparen
== name
)
340 return lparen
- name
;
343 /* Compare function to std::sort OSOs, so that members of a library
347 oso_el_compare_name (const oso_el
&l
, const oso_el
&r
)
349 return strcmp (l
.name
, r
.name
) < 0;
352 /* Hash table entry structure for the stabs symbols in the main object file.
353 This is used to speed up lookup for symbols in the OSO. */
355 struct macho_sym_hash_entry
357 struct bfd_hash_entry base
;
361 /* Routine to create an entry in the hash table. */
363 static struct bfd_hash_entry
*
364 macho_sym_hash_newfunc (struct bfd_hash_entry
*entry
,
365 struct bfd_hash_table
*table
,
368 struct macho_sym_hash_entry
*ret
= (struct macho_sym_hash_entry
*) entry
;
370 /* Allocate the structure if it has not already been allocated by a
373 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
378 /* Call the allocation method of the superclass. */
379 ret
= (struct macho_sym_hash_entry
*)
380 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
384 /* Initialize the local fields. */
388 return (struct bfd_hash_entry
*) ret
;
391 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
392 to get the value of global and common symbols. */
395 macho_resolve_oso_sym_with_minsym (struct objfile
*main_objfile
, asymbol
*sym
)
397 /* For common symbol and global symbols, use the min symtab. */
398 struct bound_minimal_symbol msym
;
399 const char *name
= sym
->name
;
401 if (name
[0] == bfd_get_symbol_leading_char (main_objfile
->obfd
))
403 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
404 if (msym
.minsym
== NULL
)
406 warning (_("can't find symbol '%s' in minsymtab"), name
);
410 return BMSYMBOL_VALUE_ADDRESS (msym
);
413 /* Add oso file OSO/ABFD as a symbol file. */
416 macho_add_oso_symfile (oso_el
*oso
, const gdb_bfd_ref_ptr
&abfd
,
418 struct objfile
*main_objfile
,
419 symfile_add_flags symfile_flags
)
423 asymbol
**symbol_table
;
425 struct bfd_hash_table table
;
428 /* Per section flag to mark which section have been rebased. */
429 unsigned char *sections_rebased
;
431 if (mach_o_debug_level
> 0)
433 (_("Loading debugging symbols from oso: %s\n"), oso
->name
);
435 if (!bfd_check_format (abfd
.get (), bfd_object
))
437 warning (_("`%s': can't read symbols: %s."), oso
->name
,
438 bfd_errmsg (bfd_get_error ()));
442 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
.get ()))
444 warning (_("`%s': file time stamp mismatch."), oso
->name
);
448 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
449 sizeof (struct macho_sym_hash_entry
),
452 warning (_("`%s': can't create hash table"), oso
->name
);
456 bfd_set_cacheable (abfd
.get (), 1);
458 /* Read symbols table. */
459 storage
= bfd_get_symtab_upper_bound (abfd
.get ());
460 symbol_table
= (asymbol
**) xmalloc (storage
);
461 bfd_canonicalize_symtab (abfd
.get (), symbol_table
);
463 /* Init section flags. */
464 nbr_sections
= bfd_count_sections (abfd
.get ());
465 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
466 for (i
= 0; i
< nbr_sections
; i
++)
467 sections_rebased
[i
] = 0;
469 /* Put symbols for the OSO file in the hash table. */
470 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
472 const asymbol
*sym
= *symp
;
473 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
475 switch (mach_o_sym
->n_type
)
483 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
494 struct macho_sym_hash_entry
*ent
;
496 ent
= (struct macho_sym_hash_entry
*)
497 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
498 if (ent
->sym
!= NULL
)
499 complaint (&symfile_complaints
,
500 _("Duplicated symbol %s in symbol table"), sym
->name
);
503 if (mach_o_debug_level
> 4)
505 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
507 (_("Adding symbol %s (addr: %s)\n"),
508 sym
->name
, paddress (arch
, sym
->value
));
515 /* Relocate symbols of the OSO. */
516 for (i
= 0; symbol_table
[i
]; i
++)
518 asymbol
*sym
= symbol_table
[i
];
519 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
521 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
523 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
526 /* For common symbol use the min symtab and modify the OSO
530 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
533 sym
->section
= bfd_com_section_ptr
;
537 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
540 asection
*sec
= sym
->section
;
541 bfd_mach_o_section
*msec
;
542 unsigned int sec_type
;
544 /* Skip buggy ones. */
545 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
548 /* Only consider regular, non-debugging sections. */
549 msec
= bfd_mach_o_get_mach_o_section (sec
);
550 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
551 if ((sec_type
== BFD_MACH_O_S_REGULAR
552 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
553 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
557 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
559 /* Use the min symtab for global symbols. */
560 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
564 struct macho_sym_hash_entry
*ent
;
566 ent
= (struct macho_sym_hash_entry
*)
567 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
569 addr
= bfd_asymbol_value (ent
->sym
);
572 /* Adjust the section. */
575 CORE_ADDR res
= addr
- sym
->value
;
577 if (mach_o_debug_level
> 3)
579 struct gdbarch
*arch
= get_objfile_arch (main_objfile
);
581 (_("resolve sect %s with %s (set to %s)\n"),
582 sec
->name
, sym
->name
,
583 paddress (arch
, res
));
585 bfd_set_section_vma (abfd
.get (), sec
, res
);
586 sections_rebased
[sec
->index
] = 1;
591 /* Mark the section as never rebased. */
592 sections_rebased
[sec
->index
] = 2;
597 bfd_hash_table_free (&table
);
599 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
600 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
601 symbol_file_add_from_bfd
602 (abfd
.get (), name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
),
604 main_objfile
->flags
& (OBJF_REORDERED
| OBJF_SHARED
605 | OBJF_READNOW
| OBJF_USERLOADED
),
609 /* Read symbols from the vector of oso files.
611 Note that this function sorts OSO_VECTOR_PTR. */
614 macho_symfile_read_all_oso (std::vector
<oso_el
> *oso_vector_ptr
,
615 struct objfile
*main_objfile
,
616 symfile_add_flags symfile_flags
)
621 /* Sort oso by name so that files from libraries are gathered. */
622 std::sort (oso_vector_ptr
->begin (), oso_vector_ptr
->end (),
623 oso_el_compare_name
);
625 for (ix
= 0; ix
< oso_vector_ptr
->size (); ++ix
)
629 oso
= &(*oso_vector_ptr
)[ix
];
631 /* Check if this is a library name. */
632 pfx_len
= get_archive_prefix_len (oso
->name
);
639 std::string
archive_name (oso
->name
, pfx_len
);
641 /* Compute number of oso for this archive. */
642 for (last_ix
= ix
; last_ix
< oso_vector_ptr
->size (); last_ix
++)
644 oso2
= &(*oso_vector_ptr
)[last_ix
];
645 if (strncmp (oso2
->name
, archive_name
.c_str (), pfx_len
) != 0)
649 /* Open the archive and check the format. */
650 gdb_bfd_ref_ptr
archive_bfd (gdb_bfd_open (archive_name
.c_str (),
652 if (archive_bfd
== NULL
)
654 warning (_("Could not open OSO archive file \"%s\""),
655 archive_name
.c_str ());
659 if (!bfd_check_format (archive_bfd
.get (), bfd_archive
))
661 warning (_("OSO archive file \"%s\" not an archive."),
662 archive_name
.c_str ());
667 gdb_bfd_ref_ptr member_bfd
668 (gdb_bfd_openr_next_archived_file (archive_bfd
.get (), NULL
));
670 if (member_bfd
== NULL
)
672 warning (_("Could not read archive members out of "
673 "OSO archive \"%s\""), archive_name
.c_str ());
678 /* Load all oso in this library. */
679 while (member_bfd
!= NULL
)
681 const char *member_name
= member_bfd
->filename
;
682 int member_len
= strlen (member_name
);
684 /* If this member is referenced, add it as a symfile. */
685 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
687 oso2
= &(*oso_vector_ptr
)[ix2
];
690 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
691 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
694 macho_add_oso_symfile (oso2
, member_bfd
,
695 bfd_get_filename (member_bfd
),
696 main_objfile
, symfile_flags
);
702 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
.get (),
705 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
707 oso_el
*oso2
= &(*oso_vector_ptr
)[ix2
];
709 if (oso2
->name
!= NULL
)
710 warning (_("Could not find specified archive member "
711 "for OSO name \"%s\""), oso
->name
);
717 gdb_bfd_ref_ptr
abfd (gdb_bfd_open (oso
->name
, gnutarget
, -1));
719 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
720 bfd_errmsg (bfd_get_error ()));
722 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
730 /* DSYM (debug symbols) files contain the debug info of an executable.
731 This is a separate file created by dsymutil(1) and is similar to debug
733 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
734 executable name and the executable base name to get the DSYM file name. */
735 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
737 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
738 and return *FILENAMEP with its original filename.
739 Return NULL if no valid dsym file is found (FILENAMEP is not used in
742 static gdb_bfd_ref_ptr
743 macho_check_dsym (struct objfile
*objfile
, std::string
*filenamep
)
745 size_t name_len
= strlen (objfile_name (objfile
));
746 size_t dsym_len
= strlen (DSYM_SUFFIX
);
747 const char *base_name
= lbasename (objfile_name (objfile
));
748 size_t base_len
= strlen (base_name
);
749 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
750 bfd_mach_o_load_command
*main_uuid
;
751 bfd_mach_o_load_command
*dsym_uuid
;
753 strcpy (dsym_filename
, objfile_name (objfile
));
754 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
755 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
757 if (access (dsym_filename
, R_OK
) != 0)
760 if (bfd_mach_o_lookup_command (objfile
->obfd
,
761 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
763 warning (_("can't find UUID in %s"), objfile_name (objfile
));
766 gdb_bfd_ref_ptr
dsym_bfd (gdb_bfd_openr (dsym_filename
, gnutarget
));
767 if (dsym_bfd
== NULL
)
769 warning (_("can't open dsym file %s"), dsym_filename
);
773 if (!bfd_check_format (dsym_bfd
.get (), bfd_object
))
775 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
779 if (bfd_mach_o_lookup_command (dsym_bfd
.get (),
780 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
782 warning (_("can't find UUID in %s"), dsym_filename
);
785 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
786 sizeof (main_uuid
->command
.uuid
.uuid
)))
788 warning (_("dsym file UUID doesn't match the one in %s"),
789 objfile_name (objfile
));
792 *filenamep
= std::string (dsym_filename
);
797 macho_symfile_read (struct objfile
*objfile
, symfile_add_flags symfile_flags
)
799 bfd
*abfd
= objfile
->obfd
;
801 std::vector
<oso_el
> oso_vector
;
803 /* Get symbols from the symbol table only if the file is an executable.
804 The symbol table of object files is not relocated and is expected to
805 be in the executable. */
806 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
808 std::string dsym_filename
;
810 /* Process the normal symbol table first. */
811 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
);
812 if (storage_needed
< 0)
813 error (_("Can't read symbols from %s: %s"),
814 bfd_get_filename (objfile
->obfd
),
815 bfd_errmsg (bfd_get_error ()));
817 if (storage_needed
> 0)
821 gdb::def_vector
<asymbol
*> symbol_table (storage_needed
822 / sizeof (asymbol
*));
824 minimal_symbol_reader
reader (objfile
);
826 symcount
= bfd_canonicalize_symtab (objfile
->obfd
,
827 symbol_table
.data ());
830 error (_("Can't read symbols from %s: %s"),
831 bfd_get_filename (objfile
->obfd
),
832 bfd_errmsg (bfd_get_error ()));
834 macho_symtab_read (reader
, objfile
, symcount
, symbol_table
.data (),
840 /* Try to read .eh_frame / .debug_frame. */
841 /* First, locate these sections. We ignore the result status
842 as it only checks for debug info. */
843 dwarf2_has_info (objfile
, NULL
);
844 dwarf2_build_frame_info (objfile
);
846 /* Check for DSYM file. */
847 gdb_bfd_ref_ptr
dsym_bfd (macho_check_dsym (objfile
, &dsym_filename
));
848 if (dsym_bfd
!= NULL
)
850 struct bfd_section
*asect
, *dsect
;
852 if (mach_o_debug_level
> 0)
853 printf_unfiltered (_("dsym file found\n"));
855 /* Set dsym section size. */
856 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
858 asect
= asect
->next
, dsect
= dsect
->next
)
860 if (strcmp (asect
->name
, dsect
->name
) != 0)
862 bfd_set_section_size (dsym_bfd
.get (), dsect
,
863 bfd_get_section_size (asect
));
866 /* Add the dsym file as a separate file. */
867 symbol_file_add_separate (dsym_bfd
.get (), dsym_filename
.c_str (),
868 symfile_flags
, objfile
);
870 /* Don't try to read dwarf2 from main file or shared libraries. */
875 if (dwarf2_has_info (objfile
, NULL
))
877 /* DWARF 2 sections */
878 dwarf2_build_psymtabs (objfile
);
882 if (!oso_vector
.empty ())
883 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
887 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
890 bfd
*abfd
= objfile
->obfd
;
892 /* We're only interested in sections with relocation
894 if ((sectp
->flags
& SEC_RELOC
) == 0)
897 if (mach_o_debug_level
> 0)
898 printf_unfiltered (_("Relocate section '%s' of %s\n"),
899 sectp
->name
, objfile_name (objfile
));
901 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
905 macho_symfile_finish (struct objfile
*objfile
)
910 macho_symfile_offsets (struct objfile
*objfile
,
911 const section_addr_info
&addrs
)
914 struct obj_section
*osect
;
916 /* Allocate section_offsets. */
917 objfile
->num_sections
= bfd_count_sections (objfile
->obfd
);
918 objfile
->section_offsets
= (struct section_offsets
*)
919 obstack_alloc (&objfile
->objfile_obstack
,
920 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
921 memset (objfile
->section_offsets
, 0,
922 SIZEOF_N_SECTION_OFFSETS (objfile
->num_sections
));
924 /* This code is run when we first add the objfile with
925 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
926 passed in. The place in symfile.c where the addrs are applied
927 depends on the addrs having section names. But in the dyld code
928 we build an anonymous array of addrs, so that code is a no-op.
929 Because of that, we have to apply the addrs to the sections here.
930 N.B. if an objfile slides after we've already created it, then it
931 goes through objfile_relocate. */
933 for (i
= 0; i
< addrs
.size (); i
++)
935 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
937 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
939 if (bfd_sect_name
== addrs
[i
].name
)
941 obj_section_offset (osect
) = addrs
[i
].addr
;
947 objfile
->sect_index_text
= 0;
949 ALL_OBJFILE_OSECTIONS (objfile
, osect
)
951 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
952 int sect_index
= osect
- objfile
->sections
;;
954 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
956 if (strcmp (bfd_sect_name
, "__TEXT") == 0
957 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
958 objfile
->sect_index_text
= sect_index
;
962 static const struct sym_fns macho_sym_fns
= {
963 macho_new_init
, /* init anything gbl to entire symtab */
964 macho_symfile_init
, /* read initial info, setup for sym_read() */
965 macho_symfile_read
, /* read a symbol file into symtab */
966 NULL
, /* sym_read_psymbols */
967 macho_symfile_finish
, /* finished with file, cleanup */
968 macho_symfile_offsets
, /* xlate external to internal form */
969 default_symfile_segments
, /* Get segment information from a file. */
971 macho_symfile_relocate
, /* Relocate a debug section. */
972 NULL
, /* sym_get_probes */
977 _initialize_machoread (void)
979 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
981 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
983 _("Set if printing Mach-O symbols processing."),
984 _("Show if printing Mach-O symbols processing."),
986 &setdebuglist
, &showdebuglist
);