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/>. */
26 #include "cli/cli-cmds.h"
29 #include "aout/stab_gnu.h"
30 #include "complaints.h"
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
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 oso_el (asymbol
**oso_sym_
, asymbol
**end_sym_
, unsigned int nbr_syms_
)
53 : name((*oso_sym_
)->name
),
54 mtime((*oso_sym_
)->value
),
61 /* Object file name. Can also be a member name. */
64 /* Associated time stamp. */
67 /* Stab symbols range for this OSO. */
71 /* Number of interesting stabs in the range. */
72 unsigned int nbr_syms
;
76 macho_new_init (struct objfile
*objfile
)
81 macho_symfile_init (struct objfile
*objfile
)
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
))
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
)
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
.get (),
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 (_("Unexpected empty N_SO stab"));
202 else if (sym
->flags
& BSF_DEBUGGING
)
204 if (mach_o_sym
->n_type
== N_OPT
)
206 /* No complaint for OPT. */
210 /* Debugging symbols are not expected here. */
211 complaint (_("%s: Unexpected debug stab outside SO markers"),
212 objfile_name (objfile
));
216 /* Non-debugging symbols go to the minimal symbol table. */
217 macho_symtab_add_minsym (reader
, objfile
, sym
);
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"));
231 else if (state
== S_FIRST_SO
)
233 /* Second SO stab for the file name. */
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
247 warning (_("stabs debugging not supported for %s"),
252 /* Non-empty OSO for a Dwarf file. */
253 oso_file
= symbol_table
+ i
;
255 state
= S_DWARF_FILE
;
259 complaint (_("Unexpected stab after SO"));
264 if (mach_o_sym
->n_type
== N_SO
)
266 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
269 if (state
== S_DWARF_FILE
)
270 oso_vector_ptr
->emplace_back (oso_file
, symbol_table
+ i
,
276 complaint (_("Missing nul SO"));
281 else if (sym
->flags
& BSF_DEBUGGING
)
283 if (state
== S_STAB_FILE
)
285 /* FIXME: to be implemented. */
289 switch (mach_o_sym
->n_type
)
292 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
296 /* Interesting symbol. */
304 complaint (_("unhandled stab for dwarf OSO file"));
310 complaint (_("non-debugging symbol within SO"));
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. */
324 get_archive_prefix_len (const char *name
)
327 int name_len
= strlen (name
);
329 if (name_len
== 0 || name
[name_len
- 1] != ')')
332 lparen
= strrchr (name
, '(');
333 if (lparen
== NULL
|| lparen
== name
)
335 return lparen
- name
;
338 /* Compare function to std::sort OSOs, so that members of a library
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
;
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
,
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
368 ret
= (struct macho_sym_hash_entry
*) bfd_hash_allocate (table
,
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
);
379 /* Initialize the local fields. */
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. */
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 struct bound_minimal_symbol msym
;
394 const char *name
= sym
->name
;
397 && *name
== bfd_get_symbol_leading_char (main_objfile
->obfd
.get ()))
399 msym
= lookup_minimal_symbol (name
, NULL
, main_objfile
);
400 if (msym
.minsym
== NULL
)
402 warning (_("can't find symbol '%s' in minsymtab"), name
);
406 return msym
.value_address ();
409 /* Add oso file OSO/ABFD as a symbol file. */
412 macho_add_oso_symfile (oso_el
*oso
, const gdb_bfd_ref_ptr
&abfd
,
414 struct objfile
*main_objfile
,
415 symfile_add_flags symfile_flags
)
419 asymbol
**symbol_table
;
421 struct bfd_hash_table table
;
424 /* Per section flag to mark which section have been rebased. */
425 unsigned char *sections_rebased
;
427 macho_debug (0, _("Loading debugging symbols from oso: %s\n"), oso
->name
);
429 if (!bfd_check_format (abfd
.get (), bfd_object
))
431 warning (_("`%s': can't read symbols: %s."), oso
->name
,
432 bfd_errmsg (bfd_get_error ()));
436 if (abfd
->my_archive
== NULL
&& oso
->mtime
!= bfd_get_mtime (abfd
.get ()))
438 warning (_("`%s': file time stamp mismatch."), oso
->name
);
442 if (!bfd_hash_table_init_n (&table
, macho_sym_hash_newfunc
,
443 sizeof (struct macho_sym_hash_entry
),
446 warning (_("`%s': can't create hash table"), oso
->name
);
450 /* Read symbols table. */
451 storage
= bfd_get_symtab_upper_bound (abfd
.get ());
452 symbol_table
= (asymbol
**) xmalloc (storage
);
453 bfd_canonicalize_symtab (abfd
.get (), symbol_table
);
455 /* Init section flags. */
456 nbr_sections
= bfd_count_sections (abfd
.get ());
457 sections_rebased
= (unsigned char *) alloca (nbr_sections
);
458 for (i
= 0; i
< nbr_sections
; i
++)
459 sections_rebased
[i
] = 0;
461 /* Put symbols for the OSO file in the hash table. */
462 for (symp
= oso
->oso_sym
; symp
!= oso
->end_sym
; symp
++)
464 const asymbol
*sym
= *symp
;
465 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
467 switch (mach_o_sym
->n_type
)
475 if (sym
->name
== NULL
|| sym
->name
[0] == 0)
486 struct macho_sym_hash_entry
*ent
;
488 ent
= (struct macho_sym_hash_entry
*)
489 bfd_hash_lookup (&table
, sym
->name
, TRUE
, FALSE
);
490 if (ent
->sym
!= NULL
)
491 complaint (_("Duplicated symbol %s in symbol table"), sym
->name
);
494 macho_debug (4, _("Adding symbol %s (addr: %s)\n"),
495 sym
->name
, paddress (main_objfile
->arch (),
502 /* Relocate symbols of the OSO. */
503 for (i
= 0; symbol_table
[i
]; i
++)
505 asymbol
*sym
= symbol_table
[i
];
506 bfd_mach_o_asymbol
*mach_o_sym
= (bfd_mach_o_asymbol
*)sym
;
508 if (mach_o_sym
->n_type
& BFD_MACH_O_N_STAB
)
510 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_UNDF
513 /* For common symbol use the min symtab and modify the OSO
517 res
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
520 sym
->section
= bfd_com_section_ptr
;
524 else if ((mach_o_sym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
527 asection
*sec
= sym
->section
;
528 bfd_mach_o_section
*msec
;
529 unsigned int sec_type
;
531 /* Skip buggy ones. */
532 if (sec
== NULL
|| sections_rebased
[sec
->index
] != 0)
535 /* Only consider regular, non-debugging sections. */
536 msec
= bfd_mach_o_get_mach_o_section (sec
);
537 sec_type
= msec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
538 if ((sec_type
== BFD_MACH_O_S_REGULAR
539 || sec_type
== BFD_MACH_O_S_ZEROFILL
)
540 && (msec
->flags
& BFD_MACH_O_S_ATTR_DEBUG
) == 0)
544 if ((mach_o_sym
->n_type
& BFD_MACH_O_N_EXT
) != 0)
546 /* Use the min symtab for global symbols. */
547 addr
= macho_resolve_oso_sym_with_minsym (main_objfile
, sym
);
551 struct macho_sym_hash_entry
*ent
;
553 ent
= (struct macho_sym_hash_entry
*)
554 bfd_hash_lookup (&table
, sym
->name
, FALSE
, FALSE
);
556 addr
= bfd_asymbol_value (ent
->sym
);
559 /* Adjust the section. */
562 CORE_ADDR res
= addr
- sym
->value
;
564 macho_debug (3, _("resolve sect %s with %s (set to %s)\n"),
565 sec
->name
, sym
->name
,
566 paddress (main_objfile
->arch (), res
));
567 bfd_set_section_vma (sec
, res
);
568 sections_rebased
[sec
->index
] = 1;
573 /* Mark the section as never rebased. */
574 sections_rebased
[sec
->index
] = 2;
579 bfd_hash_table_free (&table
);
581 /* We need to clear SYMFILE_MAINLINE to avoid interactive question
582 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
583 symbol_file_add_from_bfd
584 (abfd
, name
, symfile_flags
& ~(SYMFILE_MAINLINE
| SYMFILE_VERBOSE
),
586 main_objfile
->flags
& (OBJF_SHARED
| OBJF_READNOW
| OBJF_USERLOADED
),
590 /* Read symbols from the vector of oso files.
592 Note that this function sorts OSO_VECTOR_PTR. */
595 macho_symfile_read_all_oso (std::vector
<oso_el
> *oso_vector_ptr
,
596 struct objfile
*main_objfile
,
597 symfile_add_flags symfile_flags
)
602 /* Sort oso by name so that files from libraries are gathered. */
603 std::sort (oso_vector_ptr
->begin (), oso_vector_ptr
->end (),
604 oso_el_compare_name
);
606 for (ix
= 0; ix
< oso_vector_ptr
->size ();)
610 oso
= &(*oso_vector_ptr
)[ix
];
612 /* Check if this is a library name. */
613 pfx_len
= get_archive_prefix_len (oso
->name
);
620 std::string
archive_name (oso
->name
, pfx_len
);
622 /* Compute number of oso for this archive. */
623 for (last_ix
= ix
; last_ix
< oso_vector_ptr
->size (); last_ix
++)
625 oso2
= &(*oso_vector_ptr
)[last_ix
];
626 if (strncmp (oso2
->name
, archive_name
.c_str (), pfx_len
) != 0)
630 /* Open the archive and check the format. */
631 gdb_bfd_ref_ptr
archive_bfd (gdb_bfd_open (archive_name
.c_str (),
633 if (archive_bfd
== NULL
)
635 warning (_("Could not open OSO archive file \"%s\""),
636 archive_name
.c_str ());
640 if (!bfd_check_format (archive_bfd
.get (), bfd_archive
))
642 warning (_("OSO archive file \"%s\" not an archive."),
643 archive_name
.c_str ());
648 gdb_bfd_ref_ptr member_bfd
649 (gdb_bfd_openr_next_archived_file (archive_bfd
.get (), NULL
));
651 if (member_bfd
== NULL
)
653 warning (_("Could not read archive members out of "
654 "OSO archive \"%s\""), archive_name
.c_str ());
659 /* Load all oso in this library. */
660 while (member_bfd
!= NULL
)
662 const char *member_name
= bfd_get_filename (member_bfd
.get ());
663 int member_len
= strlen (member_name
);
665 /* If this member is referenced, add it as a symfile. */
666 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
668 oso2
= &(*oso_vector_ptr
)[ix2
];
671 && strlen (oso2
->name
) == pfx_len
+ member_len
+ 2
672 && !memcmp (member_name
, oso2
->name
+ pfx_len
+ 1,
675 macho_add_oso_symfile (oso2
, member_bfd
,
676 bfd_get_filename (member_bfd
.get ()),
677 main_objfile
, symfile_flags
);
683 member_bfd
= gdb_bfd_openr_next_archived_file (archive_bfd
.get (),
686 for (ix2
= ix
; ix2
< last_ix
; ix2
++)
688 oso2
= &(*oso_vector_ptr
)[ix2
];
690 if (oso2
->name
!= NULL
)
691 warning (_("Could not find specified archive member "
692 "for OSO name \"%s\""), oso
->name
);
698 gdb_bfd_ref_ptr
abfd (gdb_bfd_open (oso
->name
, gnutarget
));
700 warning (_("`%s': can't open to read symbols: %s."), oso
->name
,
701 bfd_errmsg (bfd_get_error ()));
703 macho_add_oso_symfile (oso
, abfd
, oso
->name
, main_objfile
,
711 /* DSYM (debug symbols) files contain the debug info of an executable.
712 This is a separate file created by dsymutil(1) and is similar to debug
714 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
715 executable name and the executable base name to get the DSYM file name. */
716 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
718 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
719 and return *FILENAMEP with its original filename.
720 Return NULL if no valid dsym file is found (FILENAMEP is not used in
723 static gdb_bfd_ref_ptr
724 macho_check_dsym (struct objfile
*objfile
, std::string
*filenamep
)
726 size_t name_len
= strlen (objfile_name (objfile
));
727 size_t dsym_len
= strlen (DSYM_SUFFIX
);
728 const char *base_name
= lbasename (objfile_name (objfile
));
729 size_t base_len
= strlen (base_name
);
730 char *dsym_filename
= (char *) alloca (name_len
+ dsym_len
+ base_len
+ 1);
731 bfd_mach_o_load_command
*main_uuid
;
732 bfd_mach_o_load_command
*dsym_uuid
;
734 strcpy (dsym_filename
, objfile_name (objfile
));
735 strcpy (dsym_filename
+ name_len
, DSYM_SUFFIX
);
736 strcpy (dsym_filename
+ name_len
+ dsym_len
, base_name
);
738 if (access (dsym_filename
, R_OK
) != 0)
741 if (bfd_mach_o_lookup_command (objfile
->obfd
.get (),
742 BFD_MACH_O_LC_UUID
, &main_uuid
) == 0)
744 warning (_("can't find UUID in %s"), objfile_name (objfile
));
747 gdb_bfd_ref_ptr
dsym_bfd (gdb_bfd_openr (dsym_filename
, gnutarget
));
748 if (dsym_bfd
== NULL
)
750 warning (_("can't open dsym file %s"), dsym_filename
);
754 if (!bfd_check_format (dsym_bfd
.get (), bfd_object
))
756 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
760 if (bfd_mach_o_lookup_command (dsym_bfd
.get (),
761 BFD_MACH_O_LC_UUID
, &dsym_uuid
) == 0)
763 warning (_("can't find UUID in %s"), dsym_filename
);
766 if (memcmp (dsym_uuid
->command
.uuid
.uuid
, main_uuid
->command
.uuid
.uuid
,
767 sizeof (main_uuid
->command
.uuid
.uuid
)))
769 warning (_("dsym file UUID doesn't match the one in %s"),
770 objfile_name (objfile
));
773 *filenamep
= std::string (dsym_filename
);
778 macho_symfile_read (struct objfile
*objfile
, symfile_add_flags symfile_flags
)
780 bfd
*abfd
= objfile
->obfd
.get ();
782 std::vector
<oso_el
> oso_vector
;
783 /* We have to hold on to the symbol table until the call to
784 macho_symfile_read_all_oso at the end of this function. */
785 gdb::def_vector
<asymbol
*> symbol_table
;
787 dwarf2_initialize_objfile (objfile
);
789 /* Get symbols from the symbol table only if the file is an executable.
790 The symbol table of object files is not relocated and is expected to
791 be in the executable. */
792 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
794 std::string dsym_filename
;
796 /* Process the normal symbol table first. */
797 storage_needed
= bfd_get_symtab_upper_bound (objfile
->obfd
.get ());
798 if (storage_needed
< 0)
799 error (_("Can't read symbols from %s: %s"),
800 bfd_get_filename (objfile
->obfd
.get ()),
801 bfd_errmsg (bfd_get_error ()));
803 if (storage_needed
> 0)
807 symbol_table
.resize (storage_needed
/ sizeof (asymbol
*));
809 minimal_symbol_reader
reader (objfile
);
811 symcount
= bfd_canonicalize_symtab (objfile
->obfd
.get (),
812 symbol_table
.data ());
815 error (_("Can't read symbols from %s: %s"),
816 bfd_get_filename (objfile
->obfd
.get ()),
817 bfd_errmsg (bfd_get_error ()));
819 macho_symtab_read (reader
, objfile
, symcount
, symbol_table
.data (),
825 /* Try to read .eh_frame / .debug_frame. */
826 dwarf2_build_frame_info (objfile
);
828 /* Check for DSYM file. */
829 gdb_bfd_ref_ptr
dsym_bfd (macho_check_dsym (objfile
, &dsym_filename
));
830 if (dsym_bfd
!= NULL
)
832 struct bfd_section
*asect
, *dsect
;
834 macho_debug (0, _("dsym file found\n"));
836 /* Set dsym section size. */
837 for (asect
= objfile
->obfd
->sections
, dsect
= dsym_bfd
->sections
;
839 asect
= asect
->next
, dsect
= dsect
->next
)
841 if (strcmp (asect
->name
, dsect
->name
) != 0)
843 bfd_set_section_size (dsect
, bfd_section_size (asect
));
846 /* Add the dsym file as a separate file. */
847 symbol_file_add_separate (dsym_bfd
, dsym_filename
.c_str (),
848 symfile_flags
, objfile
);
850 /* Don't try to read dwarf2 from main file or shared libraries. */
856 if (!oso_vector
.empty ())
857 macho_symfile_read_all_oso (&oso_vector
, objfile
, symfile_flags
);
861 macho_symfile_relocate (struct objfile
*objfile
, asection
*sectp
,
864 bfd
*abfd
= objfile
->obfd
.get ();
866 /* We're only interested in sections with relocation
868 if ((sectp
->flags
& SEC_RELOC
) == 0)
871 macho_debug (0, _("Relocate section '%s' of %s\n"),
872 sectp
->name
, objfile_name (objfile
));
874 return bfd_simple_get_relocated_section_contents (abfd
, sectp
, buf
, NULL
);
878 macho_symfile_finish (struct objfile
*objfile
)
883 macho_symfile_offsets (struct objfile
*objfile
,
884 const section_addr_info
&addrs
)
888 /* Allocate section_offsets. */
889 objfile
->section_offsets
.assign (gdb_bfd_count_sections (objfile
->obfd
.get ()), 0);
891 /* This code is run when we first add the objfile with
892 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
893 passed in. The place in symfile.c where the addrs are applied
894 depends on the addrs having section names. But in the dyld code
895 we build an anonymous array of addrs, so that code is a no-op.
896 Because of that, we have to apply the addrs to the sections here.
897 N.B. if an objfile slides after we've already created it, then it
898 goes through objfile_relocate. */
900 for (i
= 0; i
< addrs
.size (); i
++)
902 for (obj_section
*osect
: objfile
->sections ())
904 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
906 if (bfd_sect_name
== addrs
[i
].name
)
908 osect
->set_offset (addrs
[i
].addr
);
914 objfile
->sect_index_text
= 0;
916 for (obj_section
*osect
: objfile
->sections ())
918 const char *bfd_sect_name
= osect
->the_bfd_section
->name
;
919 int sect_index
= osect
- objfile
->sections_start
;
921 if (startswith (bfd_sect_name
, "LC_SEGMENT."))
923 if (strcmp (bfd_sect_name
, "__TEXT") == 0
924 || strcmp (bfd_sect_name
, "__TEXT.__text") == 0)
925 objfile
->sect_index_text
= sect_index
;
929 static const struct sym_fns macho_sym_fns
= {
930 macho_new_init
, /* init anything gbl to entire symtab */
931 macho_symfile_init
, /* read initial info, setup for sym_read() */
932 macho_symfile_read
, /* read a symbol file into symtab */
933 macho_symfile_finish
, /* finished with file, cleanup */
934 macho_symfile_offsets
, /* xlate external to internal form */
935 default_symfile_segments
, /* Get segment information from a file. */
937 macho_symfile_relocate
, /* Relocate a debug section. */
938 NULL
, /* sym_get_probes */
941 void _initialize_machoread ();
943 _initialize_machoread ()
945 add_symtab_fns (bfd_target_mach_o_flavour
, &macho_sym_fns
);
947 add_setshow_zuinteger_cmd ("mach-o", class_obscure
,
949 _("Set if printing Mach-O symbols processing."),
950 _("Show if printing Mach-O symbols processing."),
952 &setdebuglist
, &showdebuglist
);