void gdbarch_info_fill (struct gdbarch_info *info) { /* "(gdb) set architecture ...". */ if (info->bfd_arch_info == NULL && target_architecture_user) info->bfd_arch_info = target_architecture_user; /* From the file. */ if (info->bfd_arch_info == NULL && info->abfd != NULL && bfd_get_arch (info->abfd) != bfd_arch_unknown && bfd_get_arch (info->abfd) != bfd_arch_obscure) info->bfd_arch_info = bfd_get_arch_info (info->abfd); /* From the target. */ if (info->target_desc != NULL) info->bfd_arch_info = choose_architecture_for_target (info->target_desc, info->bfd_arch_info); /* From the default. */ if (info->bfd_arch_info == NULL) info->bfd_arch_info = default_bfd_arch; /* "(gdb) set byte-order ...". */ if (info->byte_order == BFD_ENDIAN_UNKNOWN && target_byte_order_user != BFD_ENDIAN_UNKNOWN) info->byte_order = target_byte_order_user; /* From the INFO struct. */ if (info->byte_order == BFD_ENDIAN_UNKNOWN && info->abfd != NULL) info->byte_order = (bfd_big_endian (info->abfd) ? BFD_ENDIAN_BIG : bfd_little_endian (info->abfd) ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_UNKNOWN); /* From the default. */ if (info->byte_order == BFD_ENDIAN_UNKNOWN) info->byte_order = default_byte_order; info->byte_order_for_code = info->byte_order; /* "(gdb) set osabi ...". Handled by gdbarch_lookup_osabi. */ /* From the manual override, or from file. */ if (info->osabi == GDB_OSABI_UNINITIALIZED) info->osabi = gdbarch_lookup_osabi (info->abfd); /* From the target. */ if (info->osabi == GDB_OSABI_UNKNOWN && info->target_desc != NULL) info->osabi = tdesc_osabi (info->target_desc); /* From the configured default. */ #ifdef GDB_OSABI_DEFAULT if (info->osabi == GDB_OSABI_UNKNOWN) info->osabi = GDB_OSABI_DEFAULT; #endif /* Must have at least filled in the architecture. */ gdb_assert (info->bfd_arch_info != NULL); }
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; }