Detect NaCl osabi from objfile
This is needed to obtain correct gdbarch structure when doing get_objfile_arch.
In particular, with correct gdbarch structure GDB calls correct gdbarch_skip_prologue hook when setting breakpoints on function start.
BUG=http://code.google.com/p/nativeclient/issues/detail?id=2898
Review URL: https://chromiumcodereview.appspot.com/10829380
diff --git a/gdb/nacl-tdep.c b/gdb/nacl-tdep.c
index e7a1a8f..9a408dd 100644
--- a/gdb/nacl-tdep.c
+++ b/gdb/nacl-tdep.c
@@ -30,6 +30,19 @@
#include "disasm.h"
#include "breakpoint.h"
#include "target.h"
+#include "elf-bfd.h"
+
+static enum gdb_osabi
+nacl_osabi_sniffer (bfd *abfd)
+{
+ /* WARNING! This way of checking for NaCl OS ABI is deprecated.
+ See http://code.google.com/p/nativeclient/issues/detail?id=2971 */
+ if (bfd_get_flavour (abfd) == bfd_target_elf_flavour &&
+ elf_elfheader (abfd)->e_ident[EI_OSABI] == 123)
+ return GDB_OSABI_NACL;
+
+ return GDB_OSABI_UNKNOWN;
+}
static void
nacl_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
@@ -153,6 +166,7 @@
amd64_nacl_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
linux_init_abi (info, gdbarch);
amd64_init_abi (info, gdbarch);
tdep->tdesc = tdesc_amd64_linux;
@@ -193,6 +207,9 @@
void
_initialize_nacl_tdep (void)
{
+ gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour,
+ nacl_osabi_sniffer);
+
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_NACL, amd64_nacl_init_abi);