void darwin_check_osabi (darwin_inferior *inf, thread_t thread) { if (gdbarch_osabi (target_gdbarch) == GDB_OSABI_UNKNOWN) { /* Attaching to a process. Let's figure out what kind it is. */ x86_thread_state_t gp_regs; struct gdbarch_info info; unsigned int gp_count = x86_THREAD_STATE_COUNT; kern_return_t ret; ret = thread_get_state (thread, x86_THREAD_STATE, (thread_state_t) &gp_regs, &gp_count); if (ret != KERN_SUCCESS) { MACH_CHECK_ERROR (ret); return; } gdbarch_info_init (&info); gdbarch_info_fill (&info); info.byte_order = gdbarch_byte_order (target_gdbarch); info.osabi = GDB_OSABI_DARWIN; if (gp_regs.tsh.flavor == x86_THREAD_STATE64) info.bfd_arch_info = bfd_lookup_arch (bfd_arch_i386, bfd_mach_x86_64); else info.bfd_arch_info = bfd_lookup_arch (bfd_arch_i386, bfd_mach_i386_i386); gdbarch_update_p (info); } }
static void show_osabi (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { if (user_osabi_state == osabi_auto) fprintf_filtered (file, _("The current OS ABI is \"auto\" " "(currently \"%s\").\n"), gdbarch_osabi_name (gdbarch_osabi (get_current_arch ()))); else fprintf_filtered (file, _("The current OS ABI is \"%s\".\n"), gdbarch_osabi_name (user_selected_osabi)); if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN) fprintf_filtered (file, _("The default OS ABI is \"%s\".\n"), gdbarch_osabi_name (GDB_OSABI_DEFAULT)); }
bfd * open_bfd_matching_arch (bfd *archive_bfd, bfd_format expected_format) { enum gdb_osabi osabi; bfd *abfd; osabi = GDB_OSABI_UNINITIALIZED; abfd = NULL; osabi = gdbarch_osabi (get_current_arch ()); if ((osabi <= GDB_OSABI_UNKNOWN) || (osabi >= GDB_OSABI_INVALID)) osabi = gdbarch_lookup_osabi (archive_bfd); // FIXME: gdbarch_lookup_osabi() doesn't work yet on archive_bfd, hardcode if ((osabi <= GDB_OSABI_UNKNOWN) || (osabi >= GDB_OSABI_INVALID)) osabi = GDB_OSABI_DARWIN; for (;;) { abfd = bfd_openr_next_archived_file (archive_bfd, abfd); if (abfd == NULL) break; if (! bfd_check_format (abfd, expected_format)) continue; if (osabi == gdbarch_lookup_osabi_from_bfd (abfd)) break; } // Copy the filename of the archive to the binary bfd. if (abfd) { xfree(abfd->filename); abfd->filename = archive_bfd->filename; } return abfd; }