bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/22504] New: MINGW: Linking to libpq.dll produced with MSVC-x64 g


From: address@hidden
Subject: [Bug ld/22504] New: MINGW: Linking to libpq.dll produced with MSVC-x64 generates invalid code
Date: Mon, 27 Nov 2017 20:36:40 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=22504

            Bug ID: 22504
           Summary: MINGW: Linking to libpq.dll produced with MSVC-x64
                    generates invalid code
           Product: binutils
           Version: 2.28
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: address@hidden
  Target Milestone: ---

Created attachment 10640
  --> https://sourceware.org/bugzilla/attachment.cgi?id=10640&action=edit
Sample code to reproduce

Hi! I'm a maintainer of the Ruby binding to PostgreSQL. I'm faced with a linker
issue when linking to PQgetvalue() in the libpq.dll for x64 provided by the
PostgreSQL project. The DLL in question is attached. It is part of the official
PostgreSQL download for Windows-x64:
https://get.enterprisedb.com/postgresql/postgresql-10.0-1-windows-x64.exe

The error can be reproduced by using the attached "segfault.c" file like so. It
fails when auto-import is disabled:

$ x86_64-w64-mingw32-gcc -o segfault.exe segfault.c
-IC:/PROGRA~1/POSTGR~1/10/include -LC:/PROGRA~1/POSTGR~1/10/lib
-Wl,--enable-auto-image-base,--disable-auto-import -lpq
C:\Users\kanis\AppData\Local\Temp\cce46Itr.o:segfault.c:(.text+0x11e):
undefined reference to `PQgetvalue'
collect2.exe: error: ld returned 1 exit status


When auto-import is enabled, then linking succeeds, but the generated code is
invalid:

$ x86_64-w64-mingw32-gcc -o segfault.exe segfault.c
-IC:/PROGRA~1/POSTGR~1/10/include -LC:/PROGRA~1/POSTGR~1/10/lib
-Wl,--enable-auto-image-base,--enable-auto-import -lpq
$ objdump -d segfault.exe

[...]
  401650:       48 8b 45 f0             mov    -0x10(%rbp),%rax
  401654:       41 b8 00 00 00 00       mov    $0x0,%r8d
  40165a:       ba 00 00 00 00          mov    $0x0,%edx
  40165f:       48 89 c1                mov    %rax,%rcx
  401662:       e8 d9 17 00 00          callq  402e40 <PQgetlength>
  401667:       89 45 ec                mov    %eax,-0x14(%rbp)
  40166a:       8b 45 ec                mov    -0x14(%rbp),%eax
  40166d:       89 c2                   mov    %eax,%edx
  40166f:       48 8d 0d e4 29 00 00    lea    0x29e4(%rip),%rcx        #
40405a <.rdata+0x5a>
  401676:       e8 25 16 00 00          callq  402ca0 <printf>
  40167b:       48 8b 45 f0             mov    -0x10(%rbp),%rax
  40167f:       41 b8 00 00 00 00       mov    $0x0,%r8d
  401685:       ba 00 00 00 00          mov    $0x0,%edx
  40168a:       48 89 c1                mov    %rax,%rcx
  40168d:       e8                      .byte 0xe8

000000000040168e <__fu0_PQgetvalue>:
  40168e:       66 6d                   insw   (%dx),%es:(%rdi)
  401690:       00 00                   add    %al,(%rax)
  401692:       48 89 45 e0             mov    %rax,-0x20(%rbp)
  401696:       48 8b 45 e0             mov    -0x20(%rbp),%rax
  40169a:       48 89 c2                mov    %rax,%rdx
  40169d:       48 8d 0d bf 29 00 00    lea    0x29bf(%rip),%rcx        #
404063 <.rdata+0x63>
  4016a4:       e8 f7 15 00 00          callq  402ca0 <printf>
[...]

$ ./segfault.exe
conn: 00000000007AA7D0
PQlibVersion: 100000
res: 00000000007B7120
len: 3
[segfault here]

The call to PQgetlength() and printf() runs through, but it segfaults on
0x40168d, because the address of callq (opcode 0xe8) is invalid. Obviously the
debug information also doesn't fit to the produced code, so that the opcodes
are not properly decoded.

Other functions like PQgetlength() are not affected. They link fine with
auto-import being enabled or disabled. The only function with this odd behavior
is PQgetvalue().

As a workaround "-l:libpq.lib" can be used to trigger linking to libpq.dll per
MSVC import library. This works for gcc-7.2.0, but older versions of gcc
(4.7.2) fail to link to any function of a MSVC produced libpq.lib file (for
some obviously fixed reason).

The issue doesn't appear when building for 32 bit x86 or when linking to a
libpq.dll produced by MINGW.


The root issue is also reproducible on Appveyor:
https://ci.appveyor.com/project/larskanis/ruby-pg-xa3f5/build/1.0.65/job/b06idaids8el773r


My environment:

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-7.2.0/configure --prefix=/mingw64
--with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32
--host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32
--with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include
--libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64
--with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada
--enable-shared --enable-static --enable-libatomic --enable-threads=posix
--enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes
--disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check
--enable-lto --enable-libgomp --disable-multilib --enable-checking=release
--disable-rpath --disable-win32-registry --disable-nls --disable-werror
--disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64
--with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64
--with-pkgversion='Rev1, Built by MSYS2 project'
--with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as
--with-gnu-ld
Thread model: posix
gcc version 7.2.0 (Rev1, Built by MSYS2 project)

$ ver
Microsoft Windows [Version 10.0.14393]

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]