bug-binutils
[Top][All Lists]
Advanced

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

[Bug ld/18640] New: ld regression when 2 .a dll import libs share one IM


From: bulk88 at hotmail dot com
Subject: [Bug ld/18640] New: ld regression when 2 .a dll import libs share one IMAGE_IMPORT_DESCRIPTOR
Date: Wed, 08 Jul 2015 05:42:56 +0000

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

            Bug ID: 18640
           Summary: ld regression when 2 .a dll import libs share one
                    IMAGE_IMPORT_DESCRIPTOR
           Product: binutils
           Version: 2.25
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: bulk88 at hotmail dot com
  Target Milestone: ---

Created attachment 8420
  --> https://sourceware.org/bugzilla/attachment.cgi?id=8420&action=edit
testcase

was writing a tool that builds a dll import library (.a) that shows GCC mangled
C++ symbols to GCC, but the DLL import table names are MSVC mangled C++ names.
I didn't want to use runtime GetProcAddress to call MSVC C++ code for startup
speed/binary size reasons (see
https://github.com/wine-mirror/wine/blob/master/dlls/msvcp90/msvcp_main.c for
an example of calling MSVC C++ from GCC). Since the MSVC C++ symbols aren't
methods and have no this arg, and are cdecl calling convention, it works. 

While writing that tool, I discovered that there will be multiple "foo.dll"
strings in the GCC produced DLL from multiple IMAGE_IMPORT_DESCRIPTOR structs
to foo.dll. Each IMAGE_IMPORT_DESCRIPTOR was coming from one .a where the
IMAGE_IMPORT_DESCRIPTOR had a different symbol name based on the output file
name to "-l" option of dlltool. I figured out that the IMAGE_IMPORT_DESCRIPTOR
can be de-duped if they all have the same symbol name. This worked fine on ld
2.19 and ld 2.17. When trying the code on newer lds I get
---------------------------------------------
ld.exe: final link failed: File truncated
collect2: ld returned 1 exit status
---------------------------------------------

The idea of merging IMAGE_IMPORT_DESCRIPTOR is shown in ldbug.zip.

gcc version 4.9.2 (i686-posix-sjlj, built by strawberryperl.com project)
GNU ld (GNU Binutils) 2.25
GNU dlltool (GNU Binutils) 2.25


ldbug failed at link time, no main.exe generated

C:\Documents and Settings\Administrator\Desktop\ldbug>gcc -g -O2 -o main.exe ma
in.o user32.a -lmingw32 -lgcc -lmingwex -lmsvcrt -lkernel32
C:/sp3222/c/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/b
in/ld.exe: final link failed: File truncated
collect2.exe: error: ld returned 1 exit status

C:\Documents and Settings\Administrator\Desktop\ldbug>

Going a little bit older toolchain at 2.22

gcc version 4.6.3 (gcc-4.6.3 release with patches [build 20120411 by
perlmingw.s
f.net])
GNU ld (GNU Binutils) 2.22.52.20120310
GNU dlltool (GNU Binutils) 2.22.52.20120310


ldbug failed at link time, no main.exe generated

C:\Documents and Settings\Administrator\Desktop\ldbug>gcc -g -O2 -o main.exe ma
in.o user32.a -lmingw32 -lgcc -lmingwex -lmsvcrt -lkernel32
c:/sp3216/c/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/b
in/ld.exe: final link failed: File truncated
collect2: ld returned 1 exit status

C:\Documents and Settings\Administrator\Desktop\ldbug>

Now a old toolchain at 2.19

gcc version 3.4.5 (mingw-vista special r3)
GNU ld (GNU Binutils) 2.19.1
GNU dlltool (GNU Binutils) 2.19.1


ldbug, main.exe successfully built, on launching main.exe a fatal error GUI box
pops up with "The procedure entry point MessageBoxDoesntExist could not be
located in the dynamic link library user32.dll." as intended. No bug with
3.4.5/2.19.


Now a different older GCC

gcc version 4.4.0 (TDM-1 mingw32)
GNU ld (GNU Binutils) 2.19.1
GNU dlltool (GNU Binutils) 2.19.1


ldbug, main.exe successfully built, on launching main.exe a fatal error GUI box
pops up with "The procedure entry point MessageBoxDoesntExist could not be
located in the dynamic link library user32.dll." as intended. No bug with
4.4.0/2.19.

now for a very old binutils

gcc version 3.4.5 (mingw-vista special r3)
GNU ld version 2.17.50 20060824
GNU dlltool 2.17.50 20060824


ldbug, main.exe successfully built, on launching main.exe a fatal error GUI box
pops up with "The procedure entry point MessageBoxDoesntExist could not be
located in the dynamic link library user32.dll." as intended. No bug with
3.4.5/2.17.

-- 
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]