summaryrefslogtreecommitdiff
path: root/gdb/amd64-windows-tdep.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2020-03-16 16:56:36 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2020-03-16 16:56:36 -0400
commit8db52437243e251c01e352cdb325bc9ace578e7c (patch)
tree440ffcb0dec2ae15a9bdd27ef31d4365070ba8a0 /gdb/amd64-windows-tdep.c
parent5982a56ab9d161923e75712fcb358824748ea4ba (diff)
downloadbinutils-gdb-8db52437243e251c01e352cdb325bc9ace578e7c.tar.gz
gdb: select "Cygwin" OS ABI for Cygwin binaries
Before this patch, the "Windows" OS ABI is selected for all Windows executables, including Cygwin ones. This patch makes GDB differentiate Cygwin binaries from non-Cygwin ones, and selects the "Cygwin" OS ABI for the Cygwin ones. To check whether a Windows PE executable is a Cygwin one, we check the library list in the .idata section, see if it contains "cygwin1.dll". I had to add code to parse the .idata section, because BFD doesn't seem to expose this information. BFD does parse this information, but only to print it in textual form (function pe_print_idata): https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=bfd/peXXigen.c;h=e42d646552a0ca1e856e082256cd3d943b54ddf0;hb=HEAD#l1261 Here's the relevant portion of the PE format documentation: https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#the-idata-section This page was also useful: https://blog.kowalczyk.info/articles/pefileformat.html#9ccef823-67e7-4372-9172-045d7b1fb006 With this patch applied, this is what I get: (gdb) file some_mingw_x86_64_binary.exe Reading symbols from some_mingw_x86_64_binary.exe... (gdb) show osabi The current OS ABI is "auto" (currently "Windows"). The default OS ABI is "GNU/Linux". (gdb) file some_mingw_i386_binary.exe Reading symbols from some_mingw_i386_binary.exe... (gdb) show osabi The current OS ABI is "auto" (currently "Windows"). The default OS ABI is "GNU/Linux". (gdb) file some_cygwin_x86_64_binary.exe Reading symbols from some_cygwin_x86_64_binary.exe... (gdb) show osabi The current OS ABI is "auto" (currently "Cygwin"). The default OS ABI is "GNU/Linux". gdb/ChangeLog: * windows-tdep.h (is_linked_with_cygwin_dll): New declaration. * windows-tdep.c (CYGWIN_DLL_NAME): New. (pe_import_directory_entry): New struct type. (is_linked_with_cygwin_dll): New function. * amd64-windows-tdep.c (amd64_windows_osabi_sniffer): Select GDB_OSABI_CYGWIN if the BFD is linked with the Cygwin DLL. * i386-windows-tdep.c (i386_windows_osabi_sniffer): Likewise.
Diffstat (limited to 'gdb/amd64-windows-tdep.c')
-rw-r--r--gdb/amd64-windows-tdep.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
index 88ff794abcb..e0346f8628f 100644
--- a/gdb/amd64-windows-tdep.c
+++ b/gdb/amd64-windows-tdep.c
@@ -1249,10 +1249,13 @@ amd64_windows_osabi_sniffer (bfd *abfd)
{
const char *target_name = bfd_get_target (abfd);
- if (strcmp (target_name, "pei-x86-64") == 0)
- return GDB_OSABI_WINDOWS;
+ if (!streq (target_name, "pei-x86-64"))
+ return GDB_OSABI_UNKNOWN;
- return GDB_OSABI_UNKNOWN;
+ if (is_linked_with_cygwin_dll (abfd))
+ return GDB_OSABI_CYGWIN;
+
+ return GDB_OSABI_WINDOWS;
}
void _initialize_amd64_windows_tdep ();