1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2012 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/>.
32 #include "gdb_assert.h"
33 #include "aout/stab_gnu.h"
36 #include "complaints.h"
40 /* If non-zero displays debugging message. */
41 static int mach_o_debug_level = 0;
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
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
52 /* Object file name. Can also be a member name. */
55 /* Associated time stamp. */
58 /* Stab symbols range for this OSO. */
62 /* Number of interesting stabs in the range. */
63 unsigned int nbr_syms;
67 /* Vector of object files to be read after the executable. This is one
68 global variable but it's life-time is the one of macho_symfile_read. */
70 static VEC (oso_el) *oso_vector;
73 macho_new_init (struct objfile *objfile)
78 macho_symfile_init (struct objfile *objfile)
80 objfile->flags |= OBJF_REORDERED;
81 init_entry_point_info (objfile);
84 /* Add a new OSO to the vector of OSO to load. */
87 macho_register_oso (struct objfile *objfile,
88 asymbol **oso_sym, asymbol **end_sym,
89 unsigned int nbr_syms)
93 el.name = (*oso_sym)->name;
94 el.mtime = (*oso_sym)->value;
97 el.nbr_syms = nbr_syms;
98 VEC_safe_push (oso_el, oso_vector, &el);
101 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
104 macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
106 if (sym->name == NULL || *sym->name == '\0')
108 /* Skip names that don't exist (shouldn't happen), or names
109 that are null strings (may happen). */
113 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
117 enum minimal_symbol_type ms_type;
119 offset = ANOFFSET (objfile->section_offsets, sym->section->index);
121 /* Bfd symbols are section relative. */
122 symaddr = sym->value + sym->section->vma;
124 /* Select global/local/weak symbols. Note that bfd puts abs
125 symbols in their own section, so all symbols we are
126 interested in will have a section. */
127 /* Relocate all non-absolute and non-TLS symbols by the
129 if (sym->section != bfd_abs_section_ptr
130 && !(sym->section->flags & SEC_THREAD_LOCAL))
133 if (sym->section == bfd_abs_section_ptr)
135 else if (sym->section->flags & SEC_CODE)
137 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
140 ms_type = mst_file_text;
142 else if (sym->section->flags & SEC_ALLOC)
144 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
146 if (sym->section->flags & SEC_LOAD)
151 else if (sym->flags & BSF_LOCAL)
153 /* Not a special stabs-in-elf symbol, do regular
154 symbol processing. */
155 if (sym->section->flags & SEC_LOAD)
156 ms_type = mst_file_data;
158 ms_type = mst_file_bss;
161 ms_type = mst_unknown;
164 return; /* Skip this symbol. */
166 prim_record_minimal_symbol_and_info
167 (sym->name, symaddr, ms_type, sym->section->index,
168 sym->section, objfile);
172 /* Build the minimal symbol table from SYMBOL_TABLE of length
173 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
176 macho_symtab_read (struct objfile *objfile,
177 long number_of_symbols, asymbol **symbol_table)
180 const asymbol *dir_so = NULL;
181 const asymbol *file_so = NULL;
182 asymbol **oso_file = NULL;
183 unsigned int nbr_syms = 0;
185 /* Current state while reading stabs. */
188 /* Not within an SO part. Only non-debugging symbols should be present,
189 and will be added to the minimal symbols table. */
192 /* First SO read. Introduce an SO section, and may be followed by a second
193 SO. The SO section should contain onl debugging symbols. */
196 /* Second non-null SO found, just after the first one. Means that the first
197 is in fact a directory name. */
200 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
206 for (i = 0; i < number_of_symbols; i++)
208 const asymbol *sym = symbol_table[i];
209 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
214 if (mach_o_sym->n_type == N_SO)
216 /* Start of object stab. */
217 if (sym->name == NULL || sym->name[0] == 0)
219 /* Unexpected empty N_SO. */
220 complaint (&symfile_complaints,
221 _("Unexpected empty N_SO stab"));
230 else if (sym->flags & BSF_DEBUGGING)
232 if (mach_o_sym->n_type == N_OPT)
234 /* No complaint for OPT. */
238 /* Debugging symbols are not expected here. */
239 complaint (&symfile_complaints,
240 _("%s: Unexpected debug stab outside SO markers"),
245 /* Non-debugging symbols go to the minimal symbol table. */
246 macho_symtab_add_minsym (objfile, sym);
252 if (mach_o_sym->n_type == N_SO)
254 if (sym->name == NULL || sym->name[0] == 0)
256 /* Unexpected empty N_SO. */
257 complaint (&symfile_complaints, _("Empty SO section"));
260 else if (state == S_FIRST_SO)
262 /* Second SO stab for the file name. */
268 complaint (&symfile_complaints, _("Three SO in a raw"));
270 else if (mach_o_sym->n_type == N_OSO)
272 if (sym->name == NULL || sym->name[0] == 0)
274 /* Empty OSO. Means that this file was compiled with
277 warning (_("stabs debugging not supported for %s"),
282 /* Non-empty OSO for a Dwarf file. */
283 oso_file = symbol_table + i;
285 state = S_DWARF_FILE;
289 complaint (&symfile_complaints,
290 _("Unexpected stab after SO"));
295 if (mach_o_sym->n_type == N_SO)
297 if (sym->name == NULL || sym->name[0] == 0)
300 if (state == S_DWARF_FILE)
301 macho_register_oso (objfile, oso_file, symbol_table + i,
307 complaint (&symfile_complaints, _("Missing nul SO"));
313 else if (sym->flags & BSF_DEBUGGING)
315 if (state == S_STAB_FILE)
317 /* FIXME: to be implemented. */
321 switch (mach_o_sym->n_type)
324 if (sym->name == NULL || sym->name[0] == 0)
328 /* Interesting symbol. */
336 complaint (&symfile_complaints,
337 _("unhandled stab for dwarf OSO file"));
343 complaint (&symfile_complaints,
344 _("non-debugging symbol within SO"));
349 if (state != S_NO_SO)
350 complaint (&symfile_complaints, _("missing nul SO"));
353 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
354 returns the length of the archive name.
355 Returns -1 otherwise. */
358 get_archive_prefix_len (const char *name)
361 int name_len = strlen (name);
363 if (name_len == 0 || name[name_len - 1] != ')')
366 lparen = strrchr (name, '(');
367 if (lparen == NULL || lparen == name)
369 return lparen - name;
372 /* Compare function to qsort OSOs, so that members of a library are
376 oso_el_compare_name (const void *vl, const void *vr)
378 const oso_el *l = (const oso_el *)vl;
379 const oso_el *r = (const oso_el *)vr;
381 return strcmp (l->name, r->name);
384 /* Hash table entry structure for the stabs symbols in the main object file.
385 This is used to speed up lookup for symbols in the OSO. */
387 struct macho_sym_hash_entry
389 struct bfd_hash_entry base;
393 /* Routine to create an entry in the hash table. */
395 static struct bfd_hash_entry *
396 macho_sym_hash_newfunc (struct bfd_hash_entry *entry,
397 struct bfd_hash_table *table,
400 struct macho_sym_hash_entry *ret = (struct macho_sym_hash_entry *) entry;
402 /* Allocate the structure if it has not already been allocated by a
405 ret = (struct macho_sym_hash_entry *) bfd_hash_allocate (table,
410 /* Call the allocation method of the superclass. */
411 ret = (struct macho_sym_hash_entry *)
412 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
416 /* Initialize the local fields. */
420 return (struct bfd_hash_entry *) ret;
423 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
424 to get the value of global and common symbols. */
427 macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
429 /* For common symbol and global symbols, use the min symtab. */
430 struct minimal_symbol *msym;
431 const char *name = sym->name;
433 if (name[0] == bfd_get_symbol_leading_char (main_objfile->obfd))
435 msym = lookup_minimal_symbol (name, NULL, main_objfile);
438 warning (_("can't find symbol '%s' in minsymtab"), name);
442 return SYMBOL_VALUE_ADDRESS (msym);
445 /* Add oso file OSO/ABFD as a symbol file. */
448 macho_add_oso_symfile (oso_el *oso, bfd *abfd,
449 struct objfile *main_objfile, int symfile_flags)
453 asymbol **symbol_table;
455 struct bfd_hash_table table;
458 /* Per section flag to mark which section have been rebased. */
459 unsigned char *sections_rebased;
461 if (mach_o_debug_level > 0)
463 (_("Loading debugging symbols from oso: %s\n"), oso->name);
465 if (!bfd_check_format (abfd, bfd_object))
467 warning (_("`%s': can't read symbols: %s."), oso->name,
468 bfd_errmsg (bfd_get_error ()));
469 gdb_bfd_unref (abfd);
473 if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd))
475 warning (_("`%s': file time stamp mismatch."), oso->name);
476 gdb_bfd_unref (abfd);
480 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc,
481 sizeof (struct macho_sym_hash_entry),
484 warning (_("`%s': can't create hash table"), oso->name);
485 gdb_bfd_unref (abfd);
489 bfd_set_cacheable (abfd, 1);
491 /* Read symbols table. */
492 storage = bfd_get_symtab_upper_bound (abfd);
493 symbol_table = (asymbol **) xmalloc (storage);
494 bfd_canonicalize_symtab (abfd, symbol_table);
496 /* Init section flags. */
497 nbr_sections = bfd_count_sections (abfd);
498 sections_rebased = (unsigned char *) alloca (nbr_sections);
499 for (i = 0; i < nbr_sections; i++)
500 sections_rebased[i] = 0;
502 /* Put symbols for the OSO file in the hash table. */
503 for (symp = oso->oso_sym; symp != oso->end_sym; symp++)
505 const asymbol *sym = *symp;
506 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
508 switch (mach_o_sym->n_type)
516 if (sym->name == NULL || sym->name[0] == 0)
527 struct macho_sym_hash_entry *ent;
529 ent = (struct macho_sym_hash_entry *)
530 bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
531 if (ent->sym != NULL)
532 complaint (&symfile_complaints,
533 _("Duplicated symbol %s in symbol table"), sym->name);
536 if (mach_o_debug_level > 4)
538 struct gdbarch *arch = get_objfile_arch (main_objfile);
540 (_("Adding symbol %s (addr: %s)\n"),
541 sym->name, paddress (arch, sym->value));
548 /* Relocate symbols of the OSO. */
549 for (i = 0; symbol_table[i]; i++)
551 asymbol *sym = symbol_table[i];
552 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
554 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
556 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
559 /* For common symbol use the min symtab and modify the OSO
563 res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
566 sym->section = bfd_com_section_ptr;
570 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
573 asection *sec = sym->section;
574 bfd_mach_o_section *msec;
575 unsigned int sec_type;
577 /* Skip buggy ones. */
578 if (sec == NULL || sections_rebased[sec->index] != 0)
581 /* Only consider regular, non-debugging sections. */
582 msec = bfd_mach_o_get_mach_o_section (sec);
583 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
584 if ((sec_type == BFD_MACH_O_S_REGULAR
585 || sec_type == BFD_MACH_O_S_ZEROFILL)
586 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
590 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
592 /* Use the min symtab for global symbols. */
593 addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
597 struct macho_sym_hash_entry *ent;
599 ent = (struct macho_sym_hash_entry *)
600 bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
602 addr = bfd_asymbol_value (ent->sym);
605 /* Adjust the section. */
608 CORE_ADDR res = addr - sym->value;
610 if (mach_o_debug_level > 3)
612 struct gdbarch *arch = get_objfile_arch (main_objfile);
614 (_("resolve sect %s with %s (set to %s)\n"),
615 sec->name, sym->name,
616 paddress (arch, res));
618 bfd_set_section_vma (abfd, sec, res);
619 sections_rebased[sec->index] = 1;
624 /* Mark the section as never rebased. */
625 sections_rebased[sec->index] = 2;
630 bfd_hash_table_free (&table);
632 /* Make sure that the filename was malloc'ed. The current filename comes
633 either from an OSO symbol name or from an archive name. Memory for both
634 is not managed by gdb. */
635 abfd->filename = xstrdup (abfd->filename);
637 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
638 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
639 symbol_file_add_from_bfd
640 (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
641 main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
642 | OBJF_READNOW | OBJF_USERLOADED),
646 /* Read symbols from the vector of oso files. */
649 macho_symfile_read_all_oso (struct objfile *main_objfile, int symfile_flags)
658 /* Sort oso by name so that files from libraries are gathered. */
659 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
660 sizeof (oso_el), oso_el_compare_name);
662 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
666 /* Check if this is a library name. */
667 pfx_len = get_archive_prefix_len (oso->name);
672 char *archive_name = XNEWVEC (char, pfx_len + 1);
677 memcpy (archive_name, oso->name, pfx_len);
678 archive_name[pfx_len] = '\0';
680 /* Compute number of oso for this archive. */
682 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
684 if (strncmp (oso2->name, archive_name, pfx_len) != 0)
688 /* Open the archive and check the format. */
689 archive_bfd = gdb_bfd_ref (bfd_openr (archive_name, gnutarget));
690 if (archive_bfd == NULL)
692 warning (_("Could not open OSO archive file \"%s\""),
697 if (!bfd_check_format (archive_bfd, bfd_archive))
699 warning (_("OSO archive file \"%s\" not an archive."),
701 gdb_bfd_unref (archive_bfd);
705 member_bfd = gdb_bfd_ref (bfd_openr_next_archived_file (archive_bfd,
708 if (member_bfd == NULL)
710 warning (_("Could not read archive members out of "
711 "OSO archive \"%s\""), archive_name);
712 gdb_bfd_unref (archive_bfd);
717 /* Load all oso in this library. */
718 while (member_bfd != NULL)
721 const char *member_name = member_bfd->filename;
722 int member_len = strlen (member_name);
724 /* If this member is referenced, add it as a symfile. */
725 for (ix2 = ix; ix2 < last_ix; ix2++)
727 oso2 = VEC_index (oso_el, vec, ix2);
730 && strlen (oso2->name) == pfx_len + member_len + 2
731 && !memcmp (member_name, oso2->name + pfx_len + 1,
734 macho_add_oso_symfile (oso2, member_bfd,
735 main_objfile, symfile_flags);
743 = gdb_bfd_ref (bfd_openr_next_archived_file (archive_bfd,
746 /* Free previous member if not referenced by an oso. */
748 gdb_bfd_unref (prev);
750 for (ix2 = ix; ix2 < last_ix; ix2++)
752 oso_el *oso2 = VEC_index (oso_el, vec, ix2);
754 if (oso2->name != NULL)
755 warning (_("Could not find specified archive member "
756 "for OSO name \"%s\""), oso->name);
764 abfd = gdb_bfd_ref (bfd_openr (oso->name, gnutarget));
766 warning (_("`%s': can't open to read symbols: %s."), oso->name,
767 bfd_errmsg (bfd_get_error ()));
769 macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags);
775 VEC_free (oso_el, vec);
778 /* DSYM (debug symbols) files contain the debug info of an executable.
779 This is a separate file created by dsymutil(1) and is similar to debug
781 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
782 executable name and the executable base name to get the DSYM file name. */
783 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
785 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
786 Return NULL if no valid dsym file is found. */
789 macho_check_dsym (struct objfile *objfile)
791 size_t name_len = strlen (objfile->name);
792 size_t dsym_len = strlen (DSYM_SUFFIX);
793 const char *base_name = lbasename (objfile->name);
794 size_t base_len = strlen (base_name);
795 char *dsym_filename = alloca (name_len + dsym_len + base_len + 1);
797 bfd_mach_o_load_command *main_uuid;
798 bfd_mach_o_load_command *dsym_uuid;
800 strcpy (dsym_filename, objfile->name);
801 strcpy (dsym_filename + name_len, DSYM_SUFFIX);
802 strcpy (dsym_filename + name_len + dsym_len, base_name);
804 if (access (dsym_filename, R_OK) != 0)
807 if (bfd_mach_o_lookup_command (objfile->obfd,
808 BFD_MACH_O_LC_UUID, &main_uuid) == 0)
810 warning (_("can't find UUID in %s"), objfile->name);
813 dsym_filename = xstrdup (dsym_filename);
814 dsym_bfd = gdb_bfd_ref (bfd_openr (dsym_filename, gnutarget));
815 if (dsym_bfd == NULL)
817 warning (_("can't open dsym file %s"), dsym_filename);
818 xfree (dsym_filename);
822 if (!bfd_check_format (dsym_bfd, bfd_object))
824 gdb_bfd_unref (dsym_bfd);
825 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
826 xfree (dsym_filename);
830 if (bfd_mach_o_lookup_command (dsym_bfd,
831 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
833 warning (_("can't find UUID in %s"), dsym_filename);
834 gdb_bfd_unref (dsym_bfd);
835 xfree (dsym_filename);
838 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
839 sizeof (main_uuid->command.uuid.uuid)))
841 warning (_("dsym file UUID doesn't match the one in %s"), objfile->name);
842 gdb_bfd_unref (dsym_bfd);
843 xfree (dsym_filename);
850 macho_symfile_read (struct objfile *objfile, int symfile_flags)
852 bfd *abfd = objfile->obfd;
857 /* Get symbols from the symbol table only if the file is an executable.
858 The symbol table of object files is not relocated and is expected to
859 be in the executable. */
860 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
862 /* Process the normal symbol table first. */
863 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
864 if (storage_needed < 0)
865 error (_("Can't read symbols from %s: %s"),
866 bfd_get_filename (objfile->obfd),
867 bfd_errmsg (bfd_get_error ()));
869 if (storage_needed > 0)
871 asymbol **symbol_table;
873 struct cleanup *back_to;
875 symbol_table = (asymbol **) xmalloc (storage_needed);
876 make_cleanup (xfree, symbol_table);
878 init_minimal_symbol_collection ();
879 back_to = make_cleanup_discard_minimal_symbols ();
881 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
884 error (_("Can't read symbols from %s: %s"),
885 bfd_get_filename (objfile->obfd),
886 bfd_errmsg (bfd_get_error ()));
888 macho_symtab_read (objfile, symcount, symbol_table);
890 install_minimal_symbols (objfile);
891 do_cleanups (back_to);
894 /* Try to read .eh_frame / .debug_frame. */
895 /* First, locate these sections. We ignore the result status
896 as it only checks for debug info. */
897 dwarf2_has_info (objfile, NULL);
898 dwarf2_build_frame_info (objfile);
900 /* Check for DSYM file. */
901 dsym_bfd = macho_check_dsym (objfile);
902 if (dsym_bfd != NULL)
906 struct bfd_section *asect, *dsect;
908 if (mach_o_debug_level > 0)
909 printf_unfiltered (_("dsym file found\n"));
911 /* Remove oso. They won't be used. */
912 VEC_free (oso_el, oso_vector);
915 /* Set dsym section size. */
916 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
918 asect = asect->next, dsect = dsect->next)
920 if (strcmp (asect->name, dsect->name) != 0)
922 bfd_set_section_size (dsym_bfd, dsect,
923 bfd_get_section_size (asect));
926 /* Add the dsym file as a separate file. */
927 symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
929 /* Don't try to read dwarf2 from main file or shared libraries. */
934 if (dwarf2_has_info (objfile, NULL))
936 /* DWARF 2 sections */
937 dwarf2_build_psymtabs (objfile);
941 if (oso_vector != NULL)
942 macho_symfile_read_all_oso (objfile, symfile_flags);
946 macho_symfile_relocate (struct objfile *objfile, asection *sectp,
949 bfd *abfd = objfile->obfd;
951 /* We're only interested in sections with relocation
953 if ((sectp->flags & SEC_RELOC) == 0)
956 if (mach_o_debug_level > 0)
957 printf_unfiltered (_("Relocate section '%s' of %s\n"),
958 sectp->name, objfile->name);
960 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
964 macho_symfile_finish (struct objfile *objfile)
969 macho_symfile_offsets (struct objfile *objfile,
970 struct section_addr_info *addrs)
973 unsigned int num_sections;
974 struct obj_section *osect;
976 /* Allocate section_offsets. */
977 objfile->num_sections = bfd_count_sections (objfile->obfd);
978 objfile->section_offsets = (struct section_offsets *)
979 obstack_alloc (&objfile->objfile_obstack,
980 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
981 memset (objfile->section_offsets, 0,
982 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
984 /* This code is run when we first add the objfile with
985 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
986 passed in. The place in symfile.c where the addrs are applied
987 depends on the addrs having section names. But in the dyld code
988 we build an anonymous array of addrs, so that code is a no-op.
989 Because of that, we have to apply the addrs to the sections here.
990 N.B. if an objfile slides after we've already created it, then it
991 goes through objfile_relocate. */
993 for (i = 0; i < addrs->num_sections; i++)
995 if (addrs->other[i].name == NULL)
998 ALL_OBJFILE_OSECTIONS (objfile, osect)
1000 const char *bfd_sect_name = osect->the_bfd_section->name;
1002 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
1004 obj_section_offset (osect) = addrs->other[i].addr;
1010 objfile->sect_index_text = 0;
1012 ALL_OBJFILE_OSECTIONS (objfile, osect)
1014 const char *bfd_sect_name = osect->the_bfd_section->name;
1015 int sect_index = osect->the_bfd_section->index;
1017 if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0)
1018 bfd_sect_name += 11;
1019 if (strcmp (bfd_sect_name, "__TEXT") == 0
1020 || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
1021 objfile->sect_index_text = sect_index;
1025 static const struct sym_fns macho_sym_fns = {
1026 bfd_target_mach_o_flavour,
1028 macho_new_init, /* init anything gbl to entire symtab */
1029 macho_symfile_init, /* read initial info, setup for sym_read() */
1030 macho_symfile_read, /* read a symbol file into symtab */
1031 NULL, /* sym_read_psymbols */
1032 macho_symfile_finish, /* finished with file, cleanup */
1033 macho_symfile_offsets, /* xlate external to internal form */
1034 default_symfile_segments, /* Get segment information from a file. */
1036 macho_symfile_relocate, /* Relocate a debug section. */
1037 NULL, /* sym_get_probes */
1041 /* -Wmissing-prototypes */
1042 extern initialize_file_ftype _initialize_machoread;
1045 _initialize_machoread ()
1047 add_symtab_fns (&macho_sym_fns);
1049 add_setshow_zinteger_cmd ("mach-o", class_obscure,
1050 &mach_o_debug_level,
1051 _("Set if printing Mach-O symbols processing."),
1052 _("Show if printing Mach-O symbols processing."),
1054 &setdebuglist, &showdebuglist);