[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