Summary: | gdb sizeof(long int)=4 but gcc sizeof(long int)=8 on x86_64-pc-cygwin | ||
---|---|---|---|
Product: | gdb | Reporter: | julian <jrose.manila> |
Component: | tdep | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | jon.turney, pedro, simark, tromey |
Priority: | P2 | Keywords: | good-first-bug |
Version: | 7.10.1 | ||
Target Milestone: | --- | ||
Host: | CYGWIN_NT-10.0 Caroline-2 2.8.0(0.309/5/3) 2017-04-01 20:47 x86_64 Cygwin | Target: | x86_64 Cygwin |
Build: | Last reconfirmed: | 2020-03-15 00:00:00 |
Description
julian
2017-05-18 10:28:09 UTC
The problem is that while Cygwin and MinGW ABIs are different, GDB assumes they're the same. amd64-windows-tdep.c has: /* On Windows, "long"s are only 32bit. */ set_gdbarch_long_bit (gdbarch, 32); and this gdbarch is used by both Cygwin and MinGW. We need a new "show osabi" value for "Windows" (MinGW), and then come up with some way to figure out automatically from the program binary which of the ABIs is in effect. Looking at the dll import list for the cygwin dll may be a good enough approximation. (And add a hardcoded case for the cygwin dll itself.) I have a patch series in the pipeline which adds a new "Windows" OS ABI, to differentiate plain Windows binaries and Cygwin Windows binaries, and then addresses this issue. The master branch has been updated by Simon Marchi <simark@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=30efb6c7af7ad8b50936157fe0a0ef22d6787dd7 commit 30efb6c7af7ad8b50936157fe0a0ef22d6787dd7 Author: Simon Marchi <simon.marchi@efficios.com> Date: Mon Mar 16 16:56:36 2020 -0400 gdb: define builtin long type to be 64 bits on amd64 Cygwin On Windows x86-64 (when building with MinGW), the size of the "long" type is 32 bits. amd64_windows_init_abi therefore does: set_gdbarch_long_bit (gdbarch, 32); This is also used when the chosen OS ABI is Cygwin, where the "long" type is 64 bits. GDB therefore gets sizeof(long) wrong when using the builtin long type: $ ./gdb -nx --data-directory=data-directory -batch -ex "set architecture i386:x86-64" -ex "set osabi Cygwin" -ex "print sizeof(long)" The target architecture is assumed to be i386:x86-64 $1 = 4 This patch makes GDB avoid setting the size of the long type to 32 bits when using the Cygwin OS ABI. it will inherit the value set in amd64_init_abi. With this patch, I get: $ ./gdb -nx --data-directory=data-directory -batch -ex "set architecture i386:x86-64" -ex "set osabi Cygwin" -ex "print sizeof(long)" The target architecture is assumed to be i386:x86-64 $1 = 8 gdb/ChangeLog: PR gdb/21500 * amd64-windows-tdep.c (amd64_windows_init_abi): Rename to... (amd64_windows_init_abi_common): ... this. Don't set size of long type. (amd64_windows_init_abi): New function. (amd64_cygwin_init_abi): New function. (_initialize_amd64_windows_tdep): Use amd64_cygwin_init_abi for the Cygwin OS ABI. * i386-windows-tdep.c (_initialize_i386_windows_tdep): Clarify comment. Fixed by commit mentioned above. |