On 17/03/2019 18:44, Simon Marchi wrote:
On 2019-03-17 05:48, Владимир Мартьянов wrote:
There are a wrong format strings in function display_selector() in
file windows-nat.c. This leads to build error using Cygwin on
Windows.
LDT_ENTRY.HighWord is a DWORD, which is unsigned long int, so the
format specification should be for long int, not simply int.
gdb/ChangeLog:
2019-03-17 Vladimir Martyanov <vilgeforce@gmail.com>
PR gdb/24351
* windows-nat.c (display_selector): Format specifications fixed
Patch and changelog files are attached
Thanks, this LGTM. I altavista'ed and it looks like this is the right
thing to do to print DWORDs. It also builds fine with
i686-w64-mingw32-gcc and x86_64-w64-mingw32-gcc on Linux.
Thanks for looking at this. But did you test this with
x86_64-pc-cygwin? It fails to build for me:
../../gdb/windows-nat.c: In function ‘int display_selector(HANDLE,
DWORD)’:
../../gdb/windows-nat.c:1099:65: error: format ‘%lx’ expects argument
of type ‘long unsigned int’, but argument 2 has type ‘unsigned int’
[-Werror=format=]
printf_filtered ("Unknown type 0x%lx",info.HighWord.Bits.Type);
~~~~~~~~~~~~~~~~~~~~~~~^
../../gdb/windows-nat.c:1106:74: error: format ‘%ld’ expects argument
of type ‘long int’, but argument 2 has type ‘unsigned int’
[-Werror=format=]
printf_filtered ("Priviledge level = %ld. ",
info.HighWord.Bits.Dpl);
I believe this is because, unfortunately, DWORD is not long on 64-bit
Cygwin, because that is LP64 (See [1]).
I think the only portable way to write this (short of introducing
inttypes.h PRI_-style macros) is to explicitly cast DWORD type values
to unsigned long or unsigned int, and use the appropriate format (e.g.
see [2] for a similar patch I wrote for xserver)
Patch attached.
[1] https://cygwin.com/faq.html#faq.programming.64bitporting
[2]
https://cgit.freedesktop.org/xorg/xserver/commit/?id=aa83c61f510121da20b56e8f7de700193f7d16b5