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_)
92 if (sym->name == NULL || *sym->name ==
'\0')
99 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
101 unrelocated_addr symaddr;
105 symaddr = unrelocated_addr (sym->value + sym->section->vma);
107 if (sym->section == bfd_abs_section_ptr)
109 else if (sym->section->flags & SEC_CODE)
111 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
116 else if (sym->section->flags & SEC_ALLOC)
118 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
120 if (sym->section->flags & SEC_LOAD)
125 else if (sym->flags & BSF_LOCAL)
129 if (sym->section->flags & SEC_LOAD)
152 long number_of_symbols, asymbol **symbol_table,
153 std::vector<oso_el> *oso_vector_ptr)
156 const asymbol *file_so = NULL;
157 asymbol **oso_file = NULL;
158 unsigned int nbr_syms = 0;
181 for (i = 0; i < number_of_symbols; i++)
183 const asymbol *sym = symbol_table[i];
184 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
189 if (mach_o_sym->n_type == N_SO)
192 if (sym->name == NULL || sym->name[0] == 0)
195 complaint (_(
"Unexpected empty N_SO stab"));
203 else if (sym->flags & BSF_DEBUGGING)
205 if (mach_o_sym->n_type == N_OPT)
212 complaint (_(
"%s: Unexpected debug stab outside SO markers"),
224 if (mach_o_sym->n_type == N_SO)
226 if (sym->name == NULL || sym->name[0] == 0)
232 else if (state == S_FIRST_SO)
241 else if (mach_o_sym->n_type == N_OSO)
243 if (sym->name == NULL || sym->name[0] == 0)
248 warning (_(
"stabs debugging not supported for %s"),
254 oso_file = symbol_table + i;
256 state = S_DWARF_FILE;
260 complaint (_(
"Unexpected stab after SO"));
265 if (mach_o_sym->n_type == N_SO)
267 if (sym->name == NULL || sym->name[0] == 0)
270 if (state == S_DWARF_FILE)
271 oso_vector_ptr->emplace_back (oso_file, symbol_table + i,
282 else if (sym->flags & BSF_DEBUGGING)
284 if (state == S_STAB_FILE)
290 switch (mach_o_sym->n_type)
293 if (sym->name == NULL || sym->name[0] == 0)
305 complaint (_(
"unhandled stab for dwarf OSO file"));
311 complaint (_(
"non-debugging symbol within SO"));
316 if (state != S_NO_SO)
328 int name_len = strlen (
name);
330 if (name_len == 0 ||
name[name_len - 1] !=
')')
333 lparen = strrchr (
name,
'(');
334 if (lparen == NULL || lparen ==
name)
336 return lparen -
name;
359static struct bfd_hash_entry *
361 struct bfd_hash_table *table,
376 bfd_hash_newfunc ((
struct bfd_hash_entry *) ret, table, string);
384 return (
struct bfd_hash_entry *) ret;
395 const char *
name = sym->name;
398 && *
name == 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);
452 storage = bfd_get_symtab_upper_bound (abfd.get ());
453 symbol_table = (asymbol **)
xmalloc (storage);
454 bfd_canonicalize_symtab (abfd.get (), symbol_table);
457 nbr_sections = bfd_count_sections (abfd.get ());
458 sections_rebased = (
unsigned char *) alloca (nbr_sections);
459 for (i = 0; i < nbr_sections; i++)
460 sections_rebased[i] = 0;
465 const asymbol *sym = *symp;
466 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
468 switch (mach_o_sym->n_type)
476 if (sym->name == NULL || sym->name[0] == 0)
490 bfd_hash_lookup (&table,
sym->name, TRUE, FALSE);
491 if (ent->
sym != NULL)
492 complaint (_(
"Duplicated symbol %s in symbol table"),
sym->name);
495 macho_debug (4, _(
"Adding symbol %s (addr: %s)\n"),
504 for (i = 0; symbol_table[i]; i++)
506 asymbol *
sym = symbol_table[i];
507 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)
sym;
509 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
511 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
521 sym->section = bfd_com_section_ptr;
525 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
528 asection *sec =
sym->section;
529 bfd_mach_o_section *msec;
530 unsigned int sec_type;
533 if (sec == NULL || sections_rebased[sec->index] != 0)
537 msec = bfd_mach_o_get_mach_o_section (sec);
538 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
539 if ((sec_type == BFD_MACH_O_S_REGULAR
540 || sec_type == BFD_MACH_O_S_ZEROFILL)
541 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
545 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
555 bfd_hash_lookup (&table,
sym->name, FALSE, FALSE);
557 addr = bfd_asymbol_value (ent->
sym);
563 CORE_ADDR res = addr -
sym->value;
565 macho_debug (3, _(
"resolve sect %s with %s (set to %s)\n"),
566 sec->name,
sym->name,
568 bfd_set_section_vma (sec, res);
569 sections_rebased[sec->index] = 1;
575 sections_rebased[sec->index] = 2;
580 bfd_hash_table_free (&table);
598 symfile_add_flags symfile_flags)
604 std::sort (oso_vector_ptr->begin (), oso_vector_ptr->end (),
607 for (ix = 0; ix < oso_vector_ptr->size ();)
611 oso = &(*oso_vector_ptr)[ix];
621 std::string archive_name (oso->
name, pfx_len);
624 for (last_ix = ix; last_ix < oso_vector_ptr->size (); last_ix++)
626 oso2 = &(*oso_vector_ptr)[last_ix];
627 if (strncmp (oso2->
name, archive_name.c_str (), pfx_len) != 0)
634 if (archive_bfd == NULL)
636 warning (_(
"Could not open OSO archive file \"%s\""),
637 archive_name.c_str ());
641 if (!bfd_check_format (archive_bfd.get (), bfd_archive))
643 warning (_(
"OSO archive file \"%s\" not an archive."),
644 archive_name.c_str ());
652 if (member_bfd == NULL)
654 warning (_(
"Could not read archive members out of "
655 "OSO archive \"%s\""), archive_name.c_str ());
661 while (member_bfd != NULL)
663 const char *member_name = bfd_get_filename (member_bfd.get ());
664 int member_len = strlen (member_name);
667 for (ix2 = ix; ix2 < last_ix; ix2++)
669 oso2 = &(*oso_vector_ptr)[ix2];
672 && strlen (oso2->
name) == pfx_len + member_len + 2
673 && !memcmp (member_name, oso2->
name + pfx_len + 1,
677 bfd_get_filename (member_bfd.get ()),
678 main_objfile, symfile_flags);
687 for (ix2 = ix; ix2 < last_ix; ix2++)
689 oso2 = &(*oso_vector_ptr)[ix2];
691 if (oso2->
name != NULL)
692 warning (_(
"Could not find specified archive member "
693 "for OSO name \"%s\""), oso->
name);
701 warning (_(
"`%s': can't open to read symbols: %s."), oso->
name,
702 bfd_errmsg (bfd_get_error ()));
717#define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
730 size_t base_len = strlen (base_name);
731 char *dsym_filename = (
char *) alloca (name_len + dsym_len + base_len + 1);
732 bfd_mach_o_load_command *main_uuid;
733 bfd_mach_o_load_command *dsym_uuid;
737 strcpy (dsym_filename + name_len + dsym_len, base_name);
739 if (access (dsym_filename, R_OK) != 0)
742 if (bfd_mach_o_lookup_command (
objfile->
obfd.get (),
743 BFD_MACH_O_LC_UUID, &main_uuid) == 0)
749 if (dsym_bfd == NULL)
751 warning (_(
"can't open dsym file %s"), dsym_filename);
755 if (!bfd_check_format (dsym_bfd.get (), bfd_object))
757 warning (_(
"bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
761 if (bfd_mach_o_lookup_command (dsym_bfd.get (),
762 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
764 warning (_(
"can't find UUID in %s"), dsym_filename);
767 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
768 sizeof (main_uuid->command.uuid.uuid)))
770 warning (_(
"dsym file UUID doesn't match the one in %s"),
774 *filenamep = std::string (dsym_filename);
783 std::vector<oso_el> oso_vector;
786 gdb::def_vector<asymbol *> symbol_table;
791 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
793 std::string dsym_filename;
796 storage_needed = bfd_get_symtab_upper_bound (
objfile->
obfd.get ());
797 if (storage_needed < 0)
798 error (_(
"Can't read symbols from %s: %s"),
800 bfd_errmsg (bfd_get_error ()));
802 if (storage_needed > 0)
806 symbol_table.resize (storage_needed /
sizeof (asymbol *));
810 symcount = bfd_canonicalize_symtab (
objfile->
obfd.get (),
811 symbol_table.data ());
814 error (_(
"Can't read symbols from %s: %s"),
816 bfd_errmsg (bfd_get_error ()));
832 if (dsym_bfd != NULL)
834 struct bfd_section *asect, *dsect;
839 for (asect =
objfile->
obfd->sections, dsect = dsym_bfd->sections;
841 asect = asect->next, dsect = dsect->next)
843 if (strcmp (asect->name, dsect->name) != 0)
845 bfd_set_section_size (dsect, bfd_section_size (asect));
864 if (!oso_vector.empty ())
876 if ((sectp->flags & SEC_RELOC) == 0)
879 macho_debug (0, _(
"Relocate section '%s' of %s\n"),
882 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
908 for (i = 0; i < addrs.size (); i++)
912 const char *bfd_sect_name = osect->the_bfd_section->name;
914 if (bfd_sect_name == addrs[i].
name)
916 osect->set_offset (addrs[i].addr);
926 const char *bfd_sect_name = osect->the_bfd_section->name;
929 if (startswith (bfd_sect_name,
"LC_SEGMENT."))
931 if (strcmp (bfd_sect_name,
"__TEXT") == 0
932 || strcmp (bfd_sect_name,
"__TEXT.__text") == 0)
957 _(
"Set if printing Mach-O symbols processing."),
958 _(
"Show if printing Mach-O symbols processing."),
void record_with_info(const char *name, unrelocated_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)
bool dwarf2_has_info(struct objfile *, const struct dwarf2_debug_sections *, bool=false)
void dwarf2_initialize_objfile(struct objfile *objfile)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct bfd_hash_entry base
struct obj_section * sections_start
iterator_range< section_iterator > sections()
struct gdbarch * arch() const
::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)