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);