Add translations for various sub-directories
[binutils-gdb.git] / gdb / machoread.c
blobac764c09496000cba43b1c85a9b5c1a0ba35e074
1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2024 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/>. */
21 #include "symtab.h"
22 #include "gdbtypes.h"
23 #include "bfd.h"
24 #include "symfile.h"
25 #include "objfiles.h"
26 #include "cli/cli-cmds.h"
27 #include "gdbcore.h"
28 #include "mach-o.h"
29 #include "aout/stab_gnu.h"
30 #include "complaints.h"
31 #include "gdb_bfd.h"
32 #include <string>
33 #include <algorithm>
34 #include "dwarf2/public.h"
36 /* If non-zero displays debugging message. */
37 static unsigned int mach_o_debug_level = 0;
39 #define macho_debug(LEVEL, FMT, ...) \
40 debug_prefixed_printf_cond_nofunc (mach_o_debug_level > LEVEL, \
41 "machoread", FMT, ## __VA_ARGS__)
43 /* Dwarf debugging information are never in the final executable. They stay
44 in object files and the executable contains the list of object files read
45 during the link.
46 Each time an oso (other source) is found in the executable, the reader
47 creates such a structure. They are read after the processing of the
48 executable. */
50 struct oso_el
52 oso_el (asymbol **oso_sym_, asymbol **end_sym_, unsigned int nbr_syms_)
53 : name((*oso_sym_)->name),
54 mtime((*oso_sym_)->value),
55 oso_sym(oso_sym_),
56 end_sym(end_sym_),
57 nbr_syms(nbr_syms_)
61 /* Object file name. Can also be a member name. */
62 const char *name;
64 /* Associated time stamp. */
65 unsigned long mtime;
67 /* Stab symbols range for this OSO. */
68 asymbol **oso_sym;
69 asymbol **end_sym;
71 /* Number of interesting stabs in the range. */
72 unsigned int nbr_syms;
75 static void
76 macho_new_init (struct objfile *objfile)
80 static void
81 macho_symfile_init (struct objfile *objfile)
85 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
87 static void
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). */
95 return;
98 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
100 unrelocated_addr symaddr;
101 enum minimal_symbol_type ms_type;
103 /* Bfd symbols are section relative. */
104 symaddr = unrelocated_addr (sym->value + sym->section->vma);
106 if (sym->section == bfd_abs_section_ptr)
107 ms_type = mst_abs;
108 else if (sym->section->flags & SEC_CODE)
110 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
111 ms_type = mst_text;
112 else
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)
120 ms_type = mst_data;
121 else
122 ms_type = mst_bss;
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;
130 else
131 ms_type = mst_file_bss;
133 else
134 ms_type = mst_unknown;
136 else
137 return; /* Skip this symbol. */
139 reader.record_with_info (sym->name, symaddr, ms_type,
140 gdb_bfd_section_index (objfile->obfd.get (),
141 sym->section));
145 /* Build the minimal symbol table from SYMBOL_TABLE of length
146 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
148 static void
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)
154 long i;
155 const asymbol *file_so = NULL;
156 asymbol **oso_file = NULL;
157 unsigned int nbr_syms = 0;
159 /* Current state while reading stabs. */
160 enum
162 /* Not within an SO part. Only non-debugging symbols should be present,
163 and will be added to the minimal symbols table. */
164 S_NO_SO,
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. */
168 S_FIRST_SO,
170 /* Second non-null SO found, just after the first one. Means that the first
171 is in fact a directory name. */
172 S_SECOND_SO,
174 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
175 S_DWARF_FILE,
177 S_STAB_FILE
178 } state = S_NO_SO;
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;
185 switch (state)
187 case S_NO_SO:
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 (_("Unexpected empty N_SO stab"));
196 else
198 file_so = sym;
199 state = S_FIRST_SO;
202 else if (sym->flags & BSF_DEBUGGING)
204 if (mach_o_sym->n_type == N_OPT)
206 /* No complaint for OPT. */
207 break;
210 /* Debugging symbols are not expected here. */
211 complaint (_("%s: Unexpected debug stab outside SO markers"),
212 objfile_name (objfile));
214 else
216 /* Non-debugging symbols go to the minimal symbol table. */
217 macho_symtab_add_minsym (reader, objfile, sym);
219 break;
221 case S_FIRST_SO:
222 case S_SECOND_SO:
223 if (mach_o_sym->n_type == N_SO)
225 if (sym->name == NULL || sym->name[0] == 0)
227 /* Unexpected empty N_SO. */
228 complaint (_("Empty SO section"));
229 state = S_NO_SO;
231 else if (state == S_FIRST_SO)
233 /* Second SO stab for the file name. */
234 file_so = sym;
235 state = S_SECOND_SO;
237 else
238 complaint (_("Three SO in a raw"));
240 else if (mach_o_sym->n_type == N_OSO)
242 if (sym->name == NULL || sym->name[0] == 0)
244 /* Empty OSO. Means that this file was compiled with
245 stabs. */
246 state = S_STAB_FILE;
247 warning (_("stabs debugging not supported for %s"),
248 file_so->name);
250 else
252 /* Non-empty OSO for a Dwarf file. */
253 oso_file = symbol_table + i;
254 nbr_syms = 0;
255 state = S_DWARF_FILE;
258 else
259 complaint (_("Unexpected stab after SO"));
260 break;
262 case S_STAB_FILE:
263 case S_DWARF_FILE:
264 if (mach_o_sym->n_type == N_SO)
266 if (sym->name == NULL || sym->name[0] == 0)
268 /* End of file. */
269 if (state == S_DWARF_FILE)
270 oso_vector_ptr->emplace_back (oso_file, symbol_table + i,
271 nbr_syms);
272 state = S_NO_SO;
274 else
276 complaint (_("Missing nul SO"));
277 file_so = sym;
278 state = S_FIRST_SO;
281 else if (sym->flags & BSF_DEBUGGING)
283 if (state == S_STAB_FILE)
285 /* FIXME: to be implemented. */
287 else
289 switch (mach_o_sym->n_type)
291 case N_FUN:
292 if (sym->name == NULL || sym->name[0] == 0)
293 break;
294 [[fallthrough]];
295 case N_STSYM:
296 /* Interesting symbol. */
297 nbr_syms++;
298 break;
299 case N_ENSYM:
300 case N_BNSYM:
301 case N_GSYM:
302 break;
303 default:
304 complaint (_("unhandled stab for dwarf OSO file"));
305 break;
309 else
310 complaint (_("non-debugging symbol within SO"));
311 break;
315 if (state != S_NO_SO)
316 complaint (_("missing nul SO"));
319 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
320 returns the length of the archive name.
321 Returns -1 otherwise. */
323 static int
324 get_archive_prefix_len (const char *name)
326 const char *lparen;
327 int name_len = strlen (name);
329 if (name_len == 0 || name[name_len - 1] != ')')
330 return -1;
332 lparen = strrchr (name, '(');
333 if (lparen == NULL || lparen == name)
334 return -1;
335 return lparen - name;
338 /* Compare function to std::sort OSOs, so that members of a library
339 are gathered. */
341 static bool
342 oso_el_compare_name (const oso_el &l, const oso_el &r)
344 return strcmp (l.name, r.name) < 0;
347 /* Hash table entry structure for the stabs symbols in the main object file.
348 This is used to speed up lookup for symbols in the OSO. */
350 struct macho_sym_hash_entry
352 struct bfd_hash_entry base;
353 const asymbol *sym;
356 /* Routine to create an entry in the hash table. */
358 static struct bfd_hash_entry *
359 macho_sym_hash_newfunc (struct bfd_hash_entry *entry,
360 struct bfd_hash_table *table,
361 const char *string)
363 struct macho_sym_hash_entry *ret = (struct macho_sym_hash_entry *) entry;
365 /* Allocate the structure if it has not already been allocated by a
366 subclass. */
367 if (ret == NULL)
368 ret = (struct macho_sym_hash_entry *) bfd_hash_allocate (table,
369 sizeof (* ret));
370 if (ret == NULL)
371 return NULL;
373 /* Call the allocation method of the superclass. */
374 ret = (struct macho_sym_hash_entry *)
375 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
377 if (ret)
379 /* Initialize the local fields. */
380 ret->sym = NULL;
383 return (struct bfd_hash_entry *) ret;
386 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
387 to get the value of global and common symbols. */
389 static CORE_ADDR
390 macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
392 /* For common symbol and global symbols, use the min symtab. */
393 const char *name = sym->name;
395 if (*name != '\0'
396 && *name == bfd_get_symbol_leading_char (main_objfile->obfd.get ()))
397 ++name;
399 bound_minimal_symbol msym
400 = lookup_minimal_symbol (current_program_space, name, main_objfile);
401 if (msym.minsym == NULL)
403 warning (_("can't find symbol '%s' in minsymtab"), name);
404 return 0;
406 else
407 return msym.value_address ();
410 /* Add oso file OSO/ABFD as a symbol file. */
412 static void
413 macho_add_oso_symfile (oso_el *oso, const gdb_bfd_ref_ptr &abfd,
414 const char *name,
415 struct objfile *main_objfile,
416 symfile_add_flags symfile_flags)
418 int storage;
419 int i;
420 asymbol **symbol_table;
421 asymbol **symp;
422 struct bfd_hash_table table;
423 int nbr_sections;
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 ()));
434 return;
437 if (abfd->my_archive == nullptr
438 && oso->mtime != gdb_bfd_get_mtime (abfd.get ()))
440 warning (_("`%s': file time stamp mismatch."), oso->name);
441 return;
444 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc,
445 sizeof (struct macho_sym_hash_entry),
446 oso->nbr_syms))
448 warning (_("`%s': can't create hash table"), oso->name);
449 return;
452 /* Read symbols table. */
453 storage = bfd_get_symtab_upper_bound (abfd.get ());
454 symbol_table = (asymbol **) xmalloc (storage);
455 bfd_canonicalize_symtab (abfd.get (), symbol_table);
457 /* Init section flags. */
458 nbr_sections = bfd_count_sections (abfd.get ());
459 sections_rebased = (unsigned char *) alloca (nbr_sections);
460 for (i = 0; i < nbr_sections; i++)
461 sections_rebased[i] = 0;
463 /* Put symbols for the OSO file in the hash table. */
464 for (symp = oso->oso_sym; symp != oso->end_sym; symp++)
466 const asymbol *sym = *symp;
467 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
469 switch (mach_o_sym->n_type)
471 case N_ENSYM:
472 case N_BNSYM:
473 case N_GSYM:
474 sym = NULL;
475 break;
476 case N_FUN:
477 if (sym->name == NULL || sym->name[0] == 0)
478 sym = NULL;
479 break;
480 case N_STSYM:
481 break;
482 default:
483 sym = NULL;
484 break;
486 if (sym != NULL)
488 struct macho_sym_hash_entry *ent;
490 ent = (struct macho_sym_hash_entry *)
491 bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
492 if (ent->sym != NULL)
493 complaint (_("Duplicated symbol %s in symbol table"), sym->name);
494 else
496 macho_debug (4, _("Adding symbol %s (addr: %s)\n"),
497 sym->name, paddress (main_objfile->arch (),
498 sym->value));
499 ent->sym = sym;
504 /* Relocate symbols of the OSO. */
505 for (i = 0; symbol_table[i]; i++)
507 asymbol *sym = symbol_table[i];
508 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
510 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
511 continue;
512 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
513 && sym->value != 0)
515 /* For common symbol use the min symtab and modify the OSO
516 symbol table. */
517 CORE_ADDR res;
519 res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
520 if (res != 0)
522 sym->section = bfd_com_section_ptr;
523 sym->value = res;
526 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
528 /* Normal symbol. */
529 asection *sec = sym->section;
530 bfd_mach_o_section *msec;
531 unsigned int sec_type;
533 /* Skip buggy ones. */
534 if (sec == NULL || sections_rebased[sec->index] != 0)
535 continue;
537 /* Only consider regular, non-debugging sections. */
538 msec = bfd_mach_o_get_mach_o_section (sec);
539 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
540 if ((sec_type == BFD_MACH_O_S_REGULAR
541 || sec_type == BFD_MACH_O_S_ZEROFILL)
542 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
544 CORE_ADDR addr = 0;
546 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
548 /* Use the min symtab for global symbols. */
549 addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
551 else
553 struct macho_sym_hash_entry *ent;
555 ent = (struct macho_sym_hash_entry *)
556 bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
557 if (ent != NULL)
558 addr = bfd_asymbol_value (ent->sym);
561 /* Adjust the section. */
562 if (addr != 0)
564 CORE_ADDR res = addr - sym->value;
566 macho_debug (3, _("resolve sect %s with %s (set to %s)\n"),
567 sec->name, sym->name,
568 paddress (main_objfile->arch (), res));
569 bfd_set_section_vma (sec, res);
570 sections_rebased[sec->index] = 1;
573 else
575 /* Mark the section as never rebased. */
576 sections_rebased[sec->index] = 2;
581 bfd_hash_table_free (&table);
583 /* We need to clear SYMFILE_MAINLINE to avoid interactive question
584 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
585 symbol_file_add_from_bfd
586 (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE),
587 NULL,
588 main_objfile->flags & (OBJF_SHARED | OBJF_READNOW | OBJF_USERLOADED),
589 main_objfile);
592 /* Read symbols from the vector of oso files.
594 Note that this function sorts OSO_VECTOR_PTR. */
596 static void
597 macho_symfile_read_all_oso (std::vector<oso_el> *oso_vector_ptr,
598 struct objfile *main_objfile,
599 symfile_add_flags symfile_flags)
601 int ix;
602 oso_el *oso;
604 /* Sort oso by name so that files from libraries are gathered. */
605 std::sort (oso_vector_ptr->begin (), oso_vector_ptr->end (),
606 oso_el_compare_name);
608 for (ix = 0; ix < oso_vector_ptr->size ();)
610 int pfx_len;
612 oso = &(*oso_vector_ptr)[ix];
614 /* Check if this is a library name. */
615 pfx_len = get_archive_prefix_len (oso->name);
616 if (pfx_len > 0)
618 int last_ix;
619 oso_el *oso2;
620 int ix2;
622 std::string archive_name (oso->name, pfx_len);
624 /* Compute number of oso for this archive. */
625 for (last_ix = ix; last_ix < oso_vector_ptr->size (); last_ix++)
627 oso2 = &(*oso_vector_ptr)[last_ix];
628 if (strncmp (oso2->name, archive_name.c_str (), pfx_len) != 0)
629 break;
632 /* Open the archive and check the format. */
633 gdb_bfd_ref_ptr archive_bfd (gdb_bfd_open (archive_name.c_str (),
634 gnutarget));
635 if (archive_bfd == NULL)
637 warning (_("Could not open OSO archive file \"%s\""),
638 archive_name.c_str ());
639 ix = last_ix;
640 continue;
642 if (!bfd_check_format (archive_bfd.get (), bfd_archive))
644 warning (_("OSO archive file \"%s\" not an archive."),
645 archive_name.c_str ());
646 ix = last_ix;
647 continue;
650 gdb_bfd_ref_ptr member_bfd
651 (gdb_bfd_openr_next_archived_file (archive_bfd.get (), NULL));
653 if (member_bfd == NULL)
655 warning (_("Could not read archive members out of "
656 "OSO archive \"%s\""), archive_name.c_str ());
657 ix = last_ix;
658 continue;
661 /* Load all oso in this library. */
662 while (member_bfd != NULL)
664 const char *member_name = bfd_get_filename (member_bfd.get ());
665 int member_len = strlen (member_name);
667 /* If this member is referenced, add it as a symfile. */
668 for (ix2 = ix; ix2 < last_ix; ix2++)
670 oso2 = &(*oso_vector_ptr)[ix2];
672 if (oso2->name
673 && strlen (oso2->name) == pfx_len + member_len + 2
674 && !memcmp (member_name, oso2->name + pfx_len + 1,
675 member_len))
677 macho_add_oso_symfile (oso2, member_bfd,
678 bfd_get_filename (member_bfd.get ()),
679 main_objfile, symfile_flags);
680 oso2->name = NULL;
681 break;
685 member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd.get (),
686 member_bfd.get ());
688 for (ix2 = ix; ix2 < last_ix; ix2++)
690 oso2 = &(*oso_vector_ptr)[ix2];
692 if (oso2->name != NULL)
693 warning (_("Could not find specified archive member "
694 "for OSO name \"%s\""), oso->name);
696 ix = last_ix;
698 else
700 gdb_bfd_ref_ptr abfd (gdb_bfd_open (oso->name, gnutarget));
701 if (abfd == NULL)
702 warning (_("`%s': can't open to read symbols: %s."), oso->name,
703 bfd_errmsg (bfd_get_error ()));
704 else
705 macho_add_oso_symfile (oso, abfd, oso->name, main_objfile,
706 symfile_flags);
708 ix++;
713 /* DSYM (debug symbols) files contain the debug info of an executable.
714 This is a separate file created by dsymutil(1) and is similar to debug
715 link feature on ELF.
716 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
717 executable name and the executable base name to get the DSYM file name. */
718 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
720 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
721 and return *FILENAMEP with its original filename.
722 Return NULL if no valid dsym file is found (FILENAMEP is not used in
723 such case). */
725 static gdb_bfd_ref_ptr
726 macho_check_dsym (struct objfile *objfile, std::string *filenamep)
728 size_t name_len = strlen (objfile_name (objfile));
729 size_t dsym_len = strlen (DSYM_SUFFIX);
730 const char *base_name = lbasename (objfile_name (objfile));
731 size_t base_len = strlen (base_name);
732 char *dsym_filename = (char *) alloca (name_len + dsym_len + base_len + 1);
733 bfd_mach_o_load_command *main_uuid;
734 bfd_mach_o_load_command *dsym_uuid;
736 strcpy (dsym_filename, objfile_name (objfile));
737 strcpy (dsym_filename + name_len, DSYM_SUFFIX);
738 strcpy (dsym_filename + name_len + dsym_len, base_name);
740 if (access (dsym_filename, R_OK) != 0)
741 return NULL;
743 if (bfd_mach_o_lookup_command (objfile->obfd.get (),
744 BFD_MACH_O_LC_UUID, &main_uuid) == 0)
746 warning (_("can't find UUID in %s"), objfile_name (objfile));
747 return NULL;
749 gdb_bfd_ref_ptr dsym_bfd (gdb_bfd_openr (dsym_filename, gnutarget));
750 if (dsym_bfd == NULL)
752 warning (_("can't open dsym file %s"), dsym_filename);
753 return NULL;
756 if (!bfd_check_format (dsym_bfd.get (), bfd_object))
758 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
759 return NULL;
762 if (bfd_mach_o_lookup_command (dsym_bfd.get (),
763 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
765 warning (_("can't find UUID in %s"), dsym_filename);
766 return NULL;
768 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
769 sizeof (main_uuid->command.uuid.uuid)))
771 warning (_("dsym file UUID doesn't match the one in %s"),
772 objfile_name (objfile));
773 return NULL;
775 *filenamep = std::string (dsym_filename);
776 return dsym_bfd;
779 static void
780 macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
782 bfd *abfd = objfile->obfd.get ();
783 long storage_needed;
784 std::vector<oso_el> oso_vector;
785 /* We have to hold on to the symbol table until the call to
786 macho_symfile_read_all_oso at the end of this function. */
787 gdb::def_vector<asymbol *> symbol_table;
789 dwarf2_initialize_objfile (objfile);
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)
807 long symcount;
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 ());
816 if (symcount < 0)
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 (),
822 &oso_vector);
824 reader.install ();
827 /* Try to read .eh_frame / .debug_frame. */
828 dwarf2_build_frame_info (objfile);
830 /* Check for DSYM file. */
831 gdb_bfd_ref_ptr dsym_bfd (macho_check_dsym (objfile, &dsym_filename));
832 if (dsym_bfd != NULL)
834 struct bfd_section *asect, *dsect;
836 macho_debug (0, _("dsym file found\n"));
838 /* Set dsym section size. */
839 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
840 asect && dsect;
841 asect = asect->next, dsect = dsect->next)
843 if (strcmp (asect->name, dsect->name) != 0)
844 break;
845 bfd_set_section_size (dsect, bfd_section_size (asect));
848 /* Add the dsym file as a separate file. */
849 symbol_file_add_separate (dsym_bfd, dsym_filename.c_str (),
850 symfile_flags, objfile);
852 /* Don't try to read dwarf2 from main file or shared libraries. */
853 return;
857 /* Then the oso. */
858 if (!oso_vector.empty ())
859 macho_symfile_read_all_oso (&oso_vector, objfile, symfile_flags);
862 static bfd_byte *
863 macho_symfile_relocate (struct objfile *objfile, asection *sectp,
864 bfd_byte *buf)
866 bfd *abfd = objfile->obfd.get ();
868 /* We're only interested in sections with relocation
869 information. */
870 if ((sectp->flags & SEC_RELOC) == 0)
871 return NULL;
873 macho_debug (0, _("Relocate section '%s' of %s\n"),
874 sectp->name, objfile_name (objfile));
876 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
879 static void
880 macho_symfile_finish (struct objfile *objfile)
884 static void
885 macho_symfile_offsets (struct objfile *objfile,
886 const section_addr_info &addrs)
888 unsigned int i;
890 /* Allocate section_offsets. */
891 objfile->section_offsets.assign (gdb_bfd_count_sections (objfile->obfd.get ()), 0);
893 /* This code is run when we first add the objfile with
894 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
895 passed in. The place in symfile.c where the addrs are applied
896 depends on the addrs having section names. But in the dyld code
897 we build an anonymous array of addrs, so that code is a no-op.
898 Because of that, we have to apply the addrs to the sections here.
899 N.B. if an objfile slides after we've already created it, then it
900 goes through objfile_relocate. */
902 for (i = 0; i < addrs.size (); i++)
904 for (obj_section *osect : objfile->sections ())
906 const char *bfd_sect_name = osect->the_bfd_section->name;
908 if (bfd_sect_name == addrs[i].name)
910 osect->set_offset (addrs[i].addr);
911 break;
916 objfile->sect_index_text = 0;
918 for (obj_section *osect : objfile->sections ())
920 const char *bfd_sect_name = osect->the_bfd_section->name;
921 int sect_index = osect - objfile->sections_start;
923 if (startswith (bfd_sect_name, "LC_SEGMENT."))
924 bfd_sect_name += 11;
925 if (strcmp (bfd_sect_name, "__TEXT") == 0
926 || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
927 objfile->sect_index_text = sect_index;
931 static const struct sym_fns macho_sym_fns = {
932 macho_new_init, /* init anything gbl to entire symtab */
933 macho_symfile_init, /* read initial info, setup for sym_read() */
934 macho_symfile_read, /* read a symbol file into symtab */
935 macho_symfile_finish, /* finished with file, cleanup */
936 macho_symfile_offsets, /* xlate external to internal form */
937 default_symfile_segments, /* Get segment information from a file. */
938 NULL,
939 macho_symfile_relocate, /* Relocate a debug section. */
940 NULL, /* sym_get_probes */
943 void _initialize_machoread ();
944 void
945 _initialize_machoread ()
947 add_symtab_fns (bfd_target_mach_o_flavour, &macho_sym_fns);
949 add_setshow_zuinteger_cmd ("mach-o", class_obscure,
950 &mach_o_debug_level,
951 _("Set if printing Mach-O symbols processing."),
952 _("Show if printing Mach-O symbols processing."),
953 NULL, NULL, NULL,
954 &setdebuglist, &showdebuglist);