diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2020-03-16 16:56:36 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2020-03-16 16:56:36 -0400 |
commit | 8db52437243e251c01e352cdb325bc9ace578e7c (patch) | |
tree | 440ffcb0dec2ae15a9bdd27ef31d4365070ba8a0 /gdb/windows-tdep.h | |
parent | 5982a56ab9d161923e75712fcb358824748ea4ba (diff) | |
download | gdb-8db52437243e251c01e352cdb325bc9ace578e7c.zip gdb-8db52437243e251c01e352cdb325bc9ace578e7c.tar.gz gdb-8db52437243e251c01e352cdb325bc9ace578e7c.tar.bz2 |
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/windows-tdep.h')
-rw-r--r-- | gdb/windows-tdep.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gdb/windows-tdep.h b/gdb/windows-tdep.h index 34474f2..f2dc426 100644 --- a/gdb/windows-tdep.h +++ b/gdb/windows-tdep.h @@ -33,4 +33,10 @@ extern void windows_xfer_shared_library (const char* so_name, extern void windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch); + +/* Return true if the Portable Executable behind ABFD uses the Cygwin dll + (cygwin1.dll). */ + +extern bool is_linked_with_cygwin_dll (bfd *abfd); + #endif |