From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17642 invoked by alias); 26 Oct 2007 01:17:48 -0000 Received: (qmail 17618 invoked by uid 22791); 26 Oct 2007 01:17:46 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate5.de.ibm.com (HELO mtagate5.de.ibm.com) (195.212.29.154) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 26 Oct 2007 01:17:41 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate5.de.ibm.com (8.13.8/8.13.8) with ESMTP id l9Q1HcIx255996 for ; Fri, 26 Oct 2007 01:17:38 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.5) with ESMTP id l9Q1HceR2339002 for ; Fri, 26 Oct 2007 03:17:38 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l9Q1HcSM004695 for ; Fri, 26 Oct 2007 03:17:38 +0200 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id l9Q1HcWd004692 for ; Fri, 26 Oct 2007 03:17:38 +0200 Message-Id: <200710260117.l9Q1HcWd004692@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Fri, 26 Oct 2007 03:17:38 +0200 Subject: [rfc] [7/9] Multi-target support: Fix GDB_OSABI_OPENBSD_AOUT problem To: gdb-patches@sourceware.org Date: Fri, 26 Oct 2007 01:18:00 -0000 From: "Ulrich Weigand" X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-10/txt/msg00698.txt.bz2 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