30#include "aout/stab_gnu.h"
40#define macho_debug(LEVEL, FMT, ...) \
41 debug_prefixed_printf_cond_nofunc (mach_o_debug_level > LEVEL, \
42 "machoread", FMT, ## __VA_ARGS__)
53 oso_el (asymbol **oso_sym_, asymbol **end_sym_,
unsigned int nbr_syms_)
93 if (sym->name == NULL || *sym->name ==
'\0')
100 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
106 symaddr = sym->value + sym->section->vma;
108 if (sym->section == bfd_abs_section_ptr)
110 else if (sym->section->flags & SEC_CODE)
112 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
117 else if (sym->section->flags & SEC_ALLOC)
119 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
121 if (sym->section->flags & SEC_LOAD)
126 else if (sym->flags & BSF_LOCAL)
130 if (sym->section->flags & SEC_LOAD)
153 long number_of_symbols, asymbol **symbol_table,
154 std::vector<oso_el> *oso_vector_ptr)
157 const asymbol *file_so = NULL;
158 asymbol **oso_file = NULL;
159 unsigned int nbr_syms = 0;
182 for (i = 0; i < number_of_symbols; i++)
184 const asymbol *sym = symbol_table[i];
185 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
190 if (mach_o_sym->n_type == N_SO)
193 if (sym->name == NULL || sym->name[0] == 0)
196 complaint (_(
"Unexpected empty N_SO stab"));
204 else if (sym->flags & BSF_DEBUGGING)
206 if (mach_o_sym->n_type == N_OPT)
213 complaint (_(
"%s: Unexpected debug stab outside SO markers"),
225 if (mach_o_sym->n_type == N_SO)
227 if (sym->name == NULL || sym->name[0] == 0)
233 else if (state == S_FIRST_SO)
242 else if (mach_o_sym->n_type == N_OSO)
244 if (sym->name == NULL || sym->name[0] == 0)
249 warning (_(
"stabs debugging not supported for %s"),
255 oso_file = symbol_table + i;
257 state = S_DWARF_FILE;
261 complaint (_(
"Unexpected stab after SO"));
266 if (mach_o_sym->n_type == N_SO)
268 if (sym->name == NULL || sym->name[0] == 0)
271 if (state == S_DWARF_FILE)
272 oso_vector_ptr->emplace_back (oso_file, symbol_table + i,
283 else if (sym->flags & BSF_DEBUGGING)
285 if (state == S_STAB_FILE)
291 switch (mach_o_sym->n_type)
294 if (sym->name == NULL || sym->name[0] == 0)
306 complaint (_(
"unhandled stab for dwarf OSO file"));
312 complaint (_(
"non-debugging symbol within SO"));
317 if (state != S_NO_SO)
329 int name_len = strlen (
name);
331 if (name_len == 0 ||
name[name_len - 1] !=
')')
334 lparen = strrchr (
name,
'(');
335 if (lparen == NULL || lparen ==
name)
337 return lparen -
name;
360static struct bfd_hash_entry *
362 struct bfd_hash_table *table,
377 bfd_hash_newfunc ((
struct bfd_hash_entry *) ret, table, string);
385 return (
struct bfd_hash_entry *) ret;
396 const char *
name = sym->name;
398 if (
name[0] == bfd_get_symbol_leading_char (main_objfile->
obfd.get ()))
403 warning (_(
"can't find symbol '%s' in minsymtab"),
name);
416 symfile_add_flags symfile_flags)
420 asymbol **symbol_table;
422 struct bfd_hash_table table;
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 ()));
437 if (abfd->my_archive == NULL && oso->
mtime != bfd_get_mtime (abfd.get ()))
439 warning (_(
"`%s': file time stamp mismatch."), oso->
name);
447 warning (_(
"`%s': can't create hash table"), oso->
name);
451 bfd_set_cacheable (abfd.get (), 1);
454 storage = bfd_get_symtab_upper_bound (abfd.get ());
455 symbol_table = (asymbol **)
xmalloc (storage);
456 bfd_canonicalize_symtab (abfd.get (), symbol_table);
459 nbr_sections = bfd_count_sections (abfd.get ());
460 sections_rebased = (
unsigned char *) alloca (nbr_sections);
461 for (i = 0; i < nbr_sections; i++)
462 sections_rebased[i] = 0;
467 const asymbol *sym = *symp;
468 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
470 switch (mach_o_sym->n_type)
478 if (sym->name == NULL || sym->name[0] == 0)
492 bfd_hash_lookup (&table,
sym->name, TRUE, FALSE);
493 if (ent->
sym != NULL)
494 complaint (_(
"Duplicated symbol %s in symbol table"),
sym->name);
497 macho_debug (4, _(
"Adding symbol %s (addr: %s)\n"),
506 for (i = 0; symbol_table[i]; i++)
508 asymbol *
sym = symbol_table[i];
509 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)
sym;
511 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
513 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
523 sym->section = bfd_com_section_ptr;
527 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
530 asection *sec =
sym->section;
531 bfd_mach_o_section *msec;
532 unsigned int sec_type;
535 if (sec == NULL || sections_rebased[sec->index] != 0)
539 msec = bfd_mach_o_get_mach_o_section (sec);
540 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
541 if ((sec_type == BFD_MACH_O_S_REGULAR
542 || sec_type == BFD_MACH_O_S_ZEROFILL)
543 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
547 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
557 bfd_hash_lookup (&table,
sym->name, FALSE, FALSE);
559 addr = bfd_asymbol_value (ent->
sym);
565 CORE_ADDR res = addr -
sym->value;
567 macho_debug (3, _(
"resolve sect %s with %s (set to %s)\n"),
568 sec->name,
sym->name,
570 bfd_set_section_vma (sec, res);
571 sections_rebased[sec->index] = 1;
577 sections_rebased[sec->index] = 2;
582 bfd_hash_table_free (&table);
601 symfile_add_flags symfile_flags)
607 std::sort (oso_vector_ptr->begin (), oso_vector_ptr->end (),
610 for (ix = 0; ix < oso_vector_ptr->size ();)
614 oso = &(*oso_vector_ptr)[ix];
624 std::string archive_name (oso->
name, pfx_len);
627 for (last_ix = ix; last_ix < oso_vector_ptr->size (); last_ix++)
629 oso2 = &(*oso_vector_ptr)[last_ix];
630 if (strncmp (oso2->
name, archive_name.c_str (), pfx_len) != 0)
637 if (archive_bfd == NULL)
639 warning (_(
"Could not open OSO archive file \"%s\""),
640 archive_name.c_str ());
644 if (!bfd_check_format (archive_bfd.get (), bfd_archive))
646 warning (_(
"OSO archive file \"%s\" not an archive."),
647 archive_name.c_str ());
655 if (member_bfd == NULL)
657 warning (_(
"Could not read archive members out of "
658 "OSO archive \"%s\""), archive_name.c_str ());
664 while (member_bfd != NULL)
666 const char *member_name = bfd_get_filename (member_bfd.get ());
667 int member_len = strlen (member_name);
670 for (ix2 = ix; ix2 < last_ix; ix2++)
672 oso2 = &(*oso_vector_ptr)[ix2];
675 && strlen (oso2->
name) == pfx_len + member_len + 2
676 && !memcmp (member_name, oso2->
name + pfx_len + 1,
680 bfd_get_filename (member_bfd.get ()),
681 main_objfile, symfile_flags);
690 for (ix2 = ix; ix2 < last_ix; ix2++)
692 oso2 = &(*oso_vector_ptr)[ix2];
694 if (oso2->
name != NULL)
695 warning (_(
"Could not find specified archive member "
696 "for OSO name \"%s\""), oso->
name);
704 warning (_(
"`%s': can't open to read symbols: %s."), oso->
name,
705 bfd_errmsg (bfd_get_error ()));
720#define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
733 size_t base_len = strlen (base_name);
734 char *dsym_filename = (
char *) alloca (name_len + dsym_len + base_len + 1);
735 bfd_mach_o_load_command *main_uuid;
736 bfd_mach_o_load_command *dsym_uuid;
740 strcpy (dsym_filename + name_len + dsym_len, base_name);
742 if (access (dsym_filename, R_OK) != 0)
745 if (bfd_mach_o_lookup_command (
objfile->
obfd.get (),
746 BFD_MACH_O_LC_UUID, &main_uuid) == 0)
752 if (dsym_bfd == NULL)
754 warning (_(
"can't open dsym file %s"), dsym_filename);
758 if (!bfd_check_format (dsym_bfd.get (), bfd_object))
760 warning (_(
"bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
764 if (bfd_mach_o_lookup_command (dsym_bfd.get (),
765 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
767 warning (_(
"can't find UUID in %s"), dsym_filename);
770 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
771 sizeof (main_uuid->command.uuid.uuid)))
773 warning (_(
"dsym file UUID doesn't match the one in %s"),
777 *filenamep = std::string (dsym_filename);
786 std::vector<oso_el> oso_vector;
789 gdb::def_vector<asymbol *> symbol_table;
794 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
796 std::string dsym_filename;
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"),
803 bfd_errmsg (bfd_get_error ()));
805 if (storage_needed > 0)
809 symbol_table.resize (storage_needed /
sizeof (asymbol *));
813 symcount = bfd_canonicalize_symtab (
objfile->
obfd.get (),
814 symbol_table.data ());
817 error (_(
"Can't read symbols from %s: %s"),
819 bfd_errmsg (bfd_get_error ()));
835 if (dsym_bfd != NULL)
837 struct bfd_section *asect, *dsect;
842 for (asect =
objfile->
obfd->sections, dsect = dsym_bfd->sections;
844 asect = asect->next, dsect = dsect->next)
846 if (strcmp (asect->name, dsect->name) != 0)
848 bfd_set_section_size (dsect, bfd_section_size (asect));
867 if (!oso_vector.empty ())
879 if ((sectp->flags & SEC_RELOC) == 0)
882 macho_debug (0, _(
"Relocate section '%s' of %s\n"),
885 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
912 for (i = 0; i < addrs.size (); i++)
918 if (bfd_sect_name == addrs[i].
name)
933 if (startswith (bfd_sect_name,
"LC_SEGMENT."))
935 if (strcmp (bfd_sect_name,
"__TEXT") == 0
936 || strcmp (bfd_sect_name,
"__TEXT.__text") == 0)
961 _(
"Set if printing Mach-O symbols processing."),
962 _(
"Show if printing Mach-O symbols processing."),
void record_with_info(const char *name, CORE_ADDR address, enum minimal_symbol_type ms_type, int section)
struct cmd_list_element * showdebuglist
struct cmd_list_element * setdebuglist
set_show_commands add_setshow_zuinteger_cmd(const char *name, enum command_class theclass, unsigned int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
#define complaint(FMT,...)
void dwarf2_build_frame_info(struct objfile *objfile)
gdb_bfd_ref_ptr gdb_bfd_openr(const char *filename, const char *target)
int gdb_bfd_section_index(bfd *abfd, asection *section)
int gdb_bfd_count_sections(bfd *abfd)
gdb_bfd_ref_ptr gdb_bfd_openr_next_archived_file(bfd *archive, bfd *previous)
gdb_bfd_ref_ptr gdb_bfd_open(const char *name, const char *target, int fd, bool warn_if_slow)
gdb::ref_ptr< struct bfd, gdb_bfd_ref_policy > gdb_bfd_ref_ptr
static unsigned int mach_o_debug_level
static bfd_byte * macho_symfile_relocate(struct objfile *objfile, asection *sectp, bfd_byte *buf)
static void macho_symfile_read_all_oso(std::vector< oso_el > *oso_vector_ptr, struct objfile *main_objfile, symfile_add_flags symfile_flags)
static void macho_symfile_init(struct objfile *objfile)
static CORE_ADDR macho_resolve_oso_sym_with_minsym(struct objfile *main_objfile, asymbol *sym)
static int get_archive_prefix_len(const char *name)
static struct bfd_hash_entry * macho_sym_hash_newfunc(struct bfd_hash_entry *entry, struct bfd_hash_table *table, const char *string)
static bool oso_el_compare_name(const oso_el &l, const oso_el &r)
static void macho_symfile_read(struct objfile *objfile, symfile_add_flags symfile_flags)
static void macho_symfile_offsets(struct objfile *objfile, const section_addr_info &addrs)
static void macho_symfile_finish(struct objfile *objfile)
static void macho_add_oso_symfile(oso_el *oso, const gdb_bfd_ref_ptr &abfd, const char *name, struct objfile *main_objfile, symfile_add_flags symfile_flags)
#define macho_debug(LEVEL, FMT,...)
static void macho_new_init(struct objfile *objfile)
static void macho_symtab_read(minimal_symbol_reader &reader, struct objfile *objfile, long number_of_symbols, asymbol **symbol_table, std::vector< oso_el > *oso_vector_ptr)
static void macho_symtab_add_minsym(minimal_symbol_reader &reader, struct objfile *objfile, const asymbol *sym)
static const struct sym_fns macho_sym_fns
void _initialize_machoread()
static gdb_bfd_ref_ptr macho_check_dsym(struct objfile *objfile, std::string *filenamep)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
const char * objfile_name(const struct objfile *objfile)
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
void dwarf2_initialize_objfile(struct objfile *objfile)
int dwarf2_has_info(struct objfile *, const struct dwarf2_debug_sections *, bool=false)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct bfd_hash_entry base
void set_offset(CORE_ADDR offset)
struct bfd_section * the_bfd_section
struct gdbarch * arch() const
struct obj_section * sections
::section_offsets section_offsets
oso_el(asymbol **oso_sym_, asymbol **end_sym_, unsigned int nbr_syms_)
void add_symtab_fns(enum bfd_flavour flavour, const struct sym_fns *sf)
symfile_segment_data_up default_symfile_segments(bfd *abfd)
void symbol_file_add_separate(const gdb_bfd_ref_ptr &bfd, const char *name, symfile_add_flags symfile_flags, struct objfile *objfile)
struct objfile * symbol_file_add_from_bfd(const gdb_bfd_ref_ptr &abfd, const char *name, symfile_add_flags add_flags, section_addr_info *addrs, objfile_flags flags, struct objfile *parent)
std::vector< other_sections > section_addr_info
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)