static gdb_bfd_ref_ptr macho_check_dsym (struct objfile *objfile, std::string *filenamep) { size_t name_len = strlen (objfile_name (objfile)); size_t dsym_len = strlen (DSYM_SUFFIX); const char *base_name = lbasename (objfile_name (objfile)); size_t base_len = strlen (base_name); char *dsym_filename = (char *) alloca (name_len + dsym_len + base_len + 1); bfd_mach_o_load_command *main_uuid; bfd_mach_o_load_command *dsym_uuid; strcpy (dsym_filename, objfile_name (objfile)); strcpy (dsym_filename + name_len, DSYM_SUFFIX); strcpy (dsym_filename + name_len + dsym_len, base_name); if (access (dsym_filename, R_OK) != 0) return NULL; if (bfd_mach_o_lookup_command (objfile->obfd, BFD_MACH_O_LC_UUID, &main_uuid) == 0) { warning (_("can't find UUID in %s"), objfile_name (objfile)); return NULL; } gdb_bfd_ref_ptr dsym_bfd (gdb_bfd_openr (dsym_filename, gnutarget)); if (dsym_bfd == NULL) { warning (_("can't open dsym file %s"), dsym_filename); return NULL; } if (!bfd_check_format (dsym_bfd.get (), bfd_object)) { warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ())); return NULL; } if (bfd_mach_o_lookup_command (dsym_bfd.get (), BFD_MACH_O_LC_UUID, &dsym_uuid) == 0) { warning (_("can't find UUID in %s"), dsym_filename); return NULL; } if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid, sizeof (main_uuid->command.uuid.uuid))) { warning (_("dsym file UUID doesn't match the one in %s"), objfile_name (objfile)); return NULL; } *filenamep = std::string (dsym_filename); return dsym_bfd; }
static char * find_program_interpreter (void) { char *buf = NULL; /* If we have an exec_bfd, get the interpreter from the load commands. */ if (exec_bfd) { bfd_mach_o_load_command *cmd; if (bfd_mach_o_lookup_command (exec_bfd, BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1) return cmd->command.dylinker.name_str; } /* If we didn't find it, read from memory. FIXME: todo. */ return buf; }