053205cc40
GDB currently uses the "Cygwin" OS ABI (GDB_OSABI_CYGWIN) for everything related to Windows. If you build a GDB for a MinGW or Cygwin target, it will have "Cygwin" as the default OS ABI in both cases (see configure.tgt). If you load either a MinGW or Cygwin binary, the "Cygwin" OS ABI will be selected in both cases. This is misleading, because Cygwin binaries are a subset of the binaries running on Windows. When building something with MinGW, the resulting binary has nothing to do with Cygwin. Cygwin binaries are only special in that they are Windows binaries that link to the cygwin1.dll library (if my understanding is correct). Looking at i386-cygwin-tdep.c, we can see that GDB does nothing different when dealing with Cygwin binaries versus non-Cygwin Windows binaries. However, there is at least one known bug which would require us to make a distinction between the two OS ABIs, and that is the size of the built-in "long" type on x86-64. On native Windows, this is 4, whereas on Cygwin it's 8. So, this patch adds a new OS ABI, "Windows", and makes GDB use it for i386 and x86-64 PE executables, instead of the "Cygwin" OS ABI. A subsequent patch will improve the OS ABI detection so that GDB differentiates the non-Cygwin Windows binaries from the Cygwin Windows binaries, and applies the "Cygwin" OS ABI for the latter. The default OS ABI remains "Cygwin" for the GDBs built with a Cygwin target. I've decided to split the i386_cygwin_osabi_sniffer function in two, I think it's cleaner to have a separate sniffer for Windows binaries and Cygwin cores, each checking one specific thing. gdb/ChangeLog: * osabi.h (enum gdb_osabi): Add GDB_OSABI_WINDOWS. * osabi.c (gdb_osabi_names): Add "Windows". * i386-cygwin-tdep.c (i386_cygwin_osabi_sniffer): Return GDB_OSABI_WINDOWS when the binary's target is "pei-i386". (i386_cygwin_core_osabi_sniffer): New function, extracted from i386_cygwin_osabi_sniffer. (_initialize_i386_cygwin_tdep): Register OS ABI GDB_OSABI_WINDOWS for i386. * amd64-windows-tdep.c (amd64_windows_osabi_sniffer): Return GDB_OSABI_WINDOWS when the binary's target is "pei-x86-64". (_initialize_amd64_windows_tdep): Register OS ABI GDB_OSABI_WINDOWS for x86-64. * configure.tgt: Use GDB_OSABI_WINDOWS as the default OS ABI when the target matches '*-*-mingw*'.
94 lines
3.1 KiB
C
94 lines
3.1 KiB
C
/* OS ABI variant handling for GDB.
|
|
Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef OSABI_H
|
|
#define OSABI_H
|
|
|
|
/* * List of known OS ABIs. If you change this, make sure to update the
|
|
table in osabi.c. */
|
|
enum gdb_osabi
|
|
{
|
|
GDB_OSABI_UNKNOWN = 0, /* keep this zero */
|
|
GDB_OSABI_NONE,
|
|
|
|
GDB_OSABI_SVR4,
|
|
GDB_OSABI_HURD,
|
|
GDB_OSABI_SOLARIS,
|
|
GDB_OSABI_LINUX,
|
|
GDB_OSABI_FREEBSD,
|
|
GDB_OSABI_NETBSD,
|
|
GDB_OSABI_OPENBSD,
|
|
GDB_OSABI_WINCE,
|
|
GDB_OSABI_GO32,
|
|
GDB_OSABI_QNXNTO,
|
|
GDB_OSABI_CYGWIN,
|
|
GDB_OSABI_WINDOWS,
|
|
GDB_OSABI_AIX,
|
|
GDB_OSABI_DICOS,
|
|
GDB_OSABI_DARWIN,
|
|
GDB_OSABI_SYMBIAN,
|
|
GDB_OSABI_OPENVMS,
|
|
GDB_OSABI_LYNXOS178,
|
|
GDB_OSABI_NEWLIB,
|
|
GDB_OSABI_SDE,
|
|
GDB_OSABI_PIKEOS,
|
|
|
|
GDB_OSABI_INVALID /* keep this last */
|
|
};
|
|
|
|
/* Register an OS ABI sniffer. Each arch/flavour may have more than
|
|
one sniffer. This is used to e.g. differentiate one OS's a.out from
|
|
another. The first sniffer to return something other than
|
|
GDB_OSABI_UNKNOWN wins, so a sniffer should be careful to claim a file
|
|
only if it knows for sure what it is. */
|
|
void gdbarch_register_osabi_sniffer (enum bfd_architecture,
|
|
enum bfd_flavour,
|
|
enum gdb_osabi (*)(bfd *));
|
|
|
|
/* Register a handler for an OS ABI variant for a given architecture
|
|
and machine type. There should be only one handler for a given OS
|
|
ABI for each architecture and machine type combination. */
|
|
void gdbarch_register_osabi (enum bfd_architecture, unsigned long,
|
|
enum gdb_osabi,
|
|
void (*)(struct gdbarch_info,
|
|
struct gdbarch *));
|
|
|
|
/* Lookup the OS ABI corresponding to the specified BFD. */
|
|
enum gdb_osabi gdbarch_lookup_osabi (bfd *);
|
|
|
|
/* Lookup the OS ABI corresponding to the specified target description
|
|
string. */
|
|
enum gdb_osabi osabi_from_tdesc_string (const char *text);
|
|
|
|
/* Initialize the gdbarch for the specified OS ABI variant. */
|
|
void gdbarch_init_osabi (struct gdbarch_info, struct gdbarch *);
|
|
|
|
/* Return the name of the specified OS ABI. */
|
|
const char *gdbarch_osabi_name (enum gdb_osabi);
|
|
|
|
/* Return a regular expression that matches the OS part of a GNU
|
|
configury triplet for the given OSABI. */
|
|
const char *osabi_triplet_regexp (enum gdb_osabi osabi);
|
|
|
|
/* Helper routine for ELF file sniffers. This looks at ABI tag note
|
|
sections to determine the OS ABI from the note. It should be called
|
|
via bfd_map_over_sections. */
|
|
void generic_elf_osabi_sniff_abi_tag_sections (bfd *, asection *, void *);
|
|
|
|
#endif /* OSABI_H */
|