[rfc] [7/9] Multi-target support: Fix GDB_OSABI_OPENBSD_AOUT problem

Ulrich Weigand uweigand@de.ibm.com
Fri Oct 26 01:18:00 GMT 2007


Hello,

this patch attempts to address a somewhat unfortunate situation
relating to OpenBSD/a.out.  

i386obsd-tdep.c contains this FIXME:

  /* FIXME: kettenis/20021020: Since OpenBSD/i386 binaries are
     indistingushable from NetBSD/i386 a.out binaries, building a GDB
     that should support both these targets will probably not work as
     expected.  */
#define GDB_OSABI_OPENBSD_AOUT GDB_OSABI_NETBSD_AOUT

In an --enable-targets=all build, this has the effect that two OSABI
sniffers for the (numerically) same OSABI are registered, leading to
an internal compiler error.

Now, assuming the comment above is correct, the problem is not really
solvable; however, we can at least try to not cause it to break an
--enable-targets=all build for everybody else.

This patch introduces a new enum value GDB_OSABI_OPENBSD_AOUT, and
duplicates the sniffers for OpenBSD/a.out and NetBSD/a.out.  Now,
as the sniffers test for the same features, it is somewhat unpredictable
whether a matching binary will be detected as OpenBSD or NetBSD.

But at least --enable-targets=all now works for all other targets,
and even for OpenBSD and NetBSD you should now at least be able to
manually select the proper version via "set osabi".

For single-target OpenBSD or NetBSD builds, everything should
continue to work as today.

Suggestions for a better solution to this problem are welcome!

Bye,
Ulrich



ChangeLog:

	* defs.h (enum gdb_osabi): Add GDB_OSABI_OPENBSD_AOUT.
	* osabi.c (gdb_osabi_name): Likewise.
	
	* i386bsd-tdep.c (i386bsd_aout_osabi_sniffer): Remove.
	(i386bsd_core_osabi_sniffer): Likewise.
	(_initialize_i386bsd_tdep): Likewise.
	* i386fbsd-tdep.c (i386fbsd_aout_osabi_sniffer): New function.
	(_initialize_i386fbsd_tdep): Register it.
	* i386nbsd-tdep.c (i386nbsd_aout_osabi_sniffer): New function.
	(i386nbsd_core_osabi_sniffer): New function.
	(_initialize_i386nbsd_tdep): Register them.
	* i386obsd-tdep.c (i386obsd_aout_osabi_sniffer): New function.
	(i386obsd_core_osabi_sniffer): New function.
	(_initialize_i386obsd_tdep): Register them.

	* i386fbsd-tdep.c: Include "gdb_string.h".
	* Makefile.in: Update dependencies.

	* vaxobsd-tdep.c (GDB_OSABI_OPENBSD_AOUT): Do not define.


diff -urNp gdb-orig/gdb/defs.h gdb-head/gdb/defs.h
--- gdb-orig/gdb/defs.h	2007-10-26 01:31:07.081304189 +0200
+++ gdb-head/gdb/defs.h	2007-10-26 00:52:44.155928505 +0200
@@ -954,6 +954,7 @@ enum gdb_osabi
   GDB_OSABI_FREEBSD_ELF,
   GDB_OSABI_NETBSD_AOUT,
   GDB_OSABI_NETBSD_ELF,
+  GDB_OSABI_OPENBSD_AOUT,
   GDB_OSABI_OPENBSD_ELF,
   GDB_OSABI_WINCE,
   GDB_OSABI_GO32,
diff -urNp gdb-orig/gdb/i386bsd-tdep.c gdb-head/gdb/i386bsd-tdep.c
--- gdb-orig/gdb/i386bsd-tdep.c	2007-10-26 01:31:07.086303468 +0200
+++ gdb-head/gdb/i386bsd-tdep.c	2007-10-26 00:52:44.159927928 +0200
@@ -85,39 +85,3 @@ i386bsd_init_abi (struct gdbarch_info in
   tdep->sc_num_regs = ARRAY_SIZE (i386bsd_sc_reg_offset);
 }
 
-
-static enum gdb_osabi
-i386bsd_aout_osabi_sniffer (bfd *abfd)
-{
-  if (strcmp (bfd_get_target (abfd), "a.out-i386-netbsd") == 0)
-    return GDB_OSABI_NETBSD_AOUT;
-
-  if (strcmp (bfd_get_target (abfd), "a.out-i386-freebsd") == 0)
-    return GDB_OSABI_FREEBSD_AOUT;
-
-  return GDB_OSABI_UNKNOWN;
-}
-
-static enum gdb_osabi
-i386bsd_core_osabi_sniffer (bfd *abfd)
-{
-  if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
-    return GDB_OSABI_NETBSD_AOUT;
-
-  return GDB_OSABI_UNKNOWN;
-}
-
-
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_i386bsd_tdep (void);
-
-void
-_initialize_i386bsd_tdep (void)
-{
-  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_aout_flavour,
-				  i386bsd_aout_osabi_sniffer);
-
-  /* BFD doesn't set a flavour for NetBSD style a.out core files.  */
-  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_unknown_flavour,
-				  i386bsd_core_osabi_sniffer);
-}
diff -urNp gdb-orig/gdb/i386fbsd-tdep.c gdb-head/gdb/i386fbsd-tdep.c
--- gdb-orig/gdb/i386fbsd-tdep.c	2007-10-26 01:31:07.091302747 +0200
+++ gdb-head/gdb/i386fbsd-tdep.c	2007-10-26 01:30:02.079837285 +0200
@@ -24,6 +24,7 @@
 #include "regcache.h"
 
 #include "gdb_assert.h"
+#include "gdb_string.h"
 
 #include "i386-tdep.h"
 #include "i387-tdep.h"
@@ -153,6 +154,15 @@ i386fbsdaout_init_abi (struct gdbarch_in
   bsd_uthread_set_collect_uthread (gdbarch, i386fbsd_collect_uthread);
 }
 
+static enum gdb_osabi
+i386fbsd_aout_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "a.out-i386-freebsd") == 0)
+    return GDB_OSABI_FREEBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
 static void
 i386fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -227,6 +237,9 @@ void _initialize_i386fbsd_tdep (void);
 void
 _initialize_i386fbsd_tdep (void)
 {
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_aout_flavour,
+				  i386fbsd_aout_osabi_sniffer);
+
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_FREEBSD_AOUT,
 			  i386fbsdaout_init_abi);
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_FREEBSD_ELF,
diff -urNp gdb-orig/gdb/i386nbsd-tdep.c gdb-head/gdb/i386nbsd-tdep.c
--- gdb-orig/gdb/i386nbsd-tdep.c	2007-10-26 01:31:07.096302026 +0200
+++ gdb-head/gdb/i386nbsd-tdep.c	2007-10-26 00:52:44.168926630 +0200
@@ -254,6 +254,24 @@ i386nbsdaout_init_abi (struct gdbarch_in
     (gdbarch, i386nbsd_aout_regset_from_core_section);
 }
 
+static enum gdb_osabi
+i386nbsd_aout_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "a.out-i386-netbsd") == 0)
+    return GDB_OSABI_NETBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
+static enum gdb_osabi
+i386nbsd_core_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
+    return GDB_OSABI_NETBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
 /* NetBSD ELF.  */
 
 static void
@@ -278,6 +296,11 @@ i386nbsdelf_init_abi (struct gdbarch_inf
 void
 _initialize_i386nbsd_tdep (void)
 {
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_aout_flavour,
+				  i386nbsd_aout_osabi_sniffer);
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_unknown_flavour,
+				  i386nbsd_core_osabi_sniffer);
+
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_NETBSD_AOUT,
 			  i386nbsdaout_init_abi);
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_NETBSD_ELF,
diff -urNp gdb-orig/gdb/i386obsd-tdep.c gdb-head/gdb/i386obsd-tdep.c
--- gdb-orig/gdb/i386obsd-tdep.c	2007-10-26 01:31:07.101301305 +0200
+++ gdb-head/gdb/i386obsd-tdep.c	2007-10-26 00:52:44.173925909 +0200
@@ -486,6 +486,29 @@ i386obsd_aout_init_abi (struct gdbarch_i
     (gdbarch, i386obsd_aout_regset_from_core_section);
 }
 
+/* FIXME: kettenis/20021020: Since OpenBSD/i386 binaries are
+   indistingushable from NetBSD/i386 a.out binaries, building a GDB
+   that should support both these targets will probably not work as
+   expected.  */
+
+static enum gdb_osabi
+i386obsd_aout_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "a.out-i386-netbsd") == 0)
+    return GDB_OSABI_OPENBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
+static enum gdb_osabi
+i386obsd_core_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
+    return GDB_OSABI_OPENBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
 /* OpenBSD ELF.  */
 
 static void
@@ -511,11 +534,10 @@ void _initialize_i386obsd_tdep (void);
 void
 _initialize_i386obsd_tdep (void)
 {
-  /* FIXME: kettenis/20021020: Since OpenBSD/i386 binaries are
-     indistingushable from NetBSD/i386 a.out binaries, building a GDB
-     that should support both these targets will probably not work as
-     expected.  */
-#define GDB_OSABI_OPENBSD_AOUT GDB_OSABI_NETBSD_AOUT
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_aout_flavour,
+				  i386obsd_aout_osabi_sniffer);
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_unknown_flavour,
+				  i386obsd_core_osabi_sniffer);
 
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_OPENBSD_AOUT,
 			  i386obsd_aout_init_abi);
diff -urNp gdb-orig/gdb/Makefile.in gdb-head/gdb/Makefile.in
--- gdb-orig/gdb/Makefile.in	2007-10-26 01:30:45.779192703 +0200
+++ gdb-head/gdb/Makefile.in	2007-10-26 01:30:29.308033904 +0200
@@ -2179,8 +2179,8 @@ i386fbsd-nat.o: i386fbsd-nat.c $(defs_h)
 	$(target_h) $(fbsd_nat_h) $(i386_tdep_h) $(i386bsd_nat_h) \
 	$(bsd_kvm_h)
 i386fbsd-tdep.o: i386fbsd-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \
-	$(osabi_h) $(regcache_h) $(gdb_assert_h) $(i386_tdep_h) \
-	$(i387_tdep_h) $(bsd_uthread_h) $(solib_svr4_h)
+	$(osabi_h) $(regcache_h) $(gdb_assert_h) $(gdb_string_h) \
+	$(i386_tdep_h) $(i387_tdep_h) $(bsd_uthread_h) $(solib_svr4_h)
 i386gnu-nat.o: i386gnu-nat.c $(defs_h) $(inferior_h) $(floatformat_h) \
 	$(regcache_h) $(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) \
 	$(gnu_nat_h) $(i387_tdep_h) $(gregset_h)
diff -urNp gdb-orig/gdb/osabi.c gdb-head/gdb/osabi.c
--- gdb-orig/gdb/osabi.c	2007-10-26 01:31:07.106300584 +0200
+++ gdb-head/gdb/osabi.c	2007-10-26 00:52:44.178925188 +0200
@@ -59,6 +59,7 @@ static const char * const gdb_osabi_name
   "FreeBSD ELF",
   "NetBSD a.out",
   "NetBSD ELF",
+  "OpenBSD a.out",
   "OpenBSD ELF",
   "Windows CE",
   "DJGPP",
diff -urNp gdb-orig/gdb/vaxobsd-tdep.c gdb-head/gdb/vaxobsd-tdep.c
--- gdb-orig/gdb/vaxobsd-tdep.c	2007-10-26 01:31:07.111299864 +0200
+++ gdb-head/gdb/vaxobsd-tdep.c	2007-10-26 00:52:44.182924611 +0200
@@ -162,7 +162,6 @@ vaxobsd_init_abi (struct gdbarch_info in
    indistingushable from NetBSD/vax a.out binaries, building a GDB
    that should support both these targets will probably not work as
    expected.  */
-#define GDB_OSABI_OPENBSD_AOUT GDB_OSABI_NETBSD_AOUT
 
 static enum gdb_osabi
 vaxobsd_aout_osabi_sniffer (bfd *abfd)
-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com



More information about the Gdb-patches mailing list