[LLVMdev] [LLD] support for dlltool generated libs in COFF/PECOFF

Martell Malone martellmalone at gmail.com
Thu Jul 23 08:22:08 PDT 2015


I forgot to attach the notes.txt with the objdump.


On Thu, Jul 23, 2015 at 3:55 PM, Martell Malone <martellmalone at gmail.com>
wrote:

> Hi again rui, :)
>
> I've got all the patches into llvm and clang for supporting mingw-w64 via
> compiler-rt and now we are able to build a full mingw-w64 toolchain without
> gcc :)
> With great help from yaron and rnk.
>
> I've CC'd them as they might have interest in seeing this target through
> with me to the end :)
>
> So I have again turned my attention to LLD so that we can also remove ld
> as a depend for this target
>
> Previously I raised the issue that while lld would infact link exe's for
> me the issue was the sections were malformed and thus crashed on launch.
>
> I've done some debugging reguarding this and discovered it is due to
> differences between what MSVC's lib.exe and binutils dlltool produces
>
> I have attached a very simple .def file and generated libs via dlltool
> along with an objdump -s log of the lib.exe version
>
> I don't know too much about the internals of lld to be able to tell the
> exact cause of the problem but there are 3 specific differences I noted.
>
> 1. With dlltool each object has the name of a compiled .o file this is the
> one it generates when building the code section
> With lib each object has the dll name
>
> 2. With dlltool section 7 is used for the dll name and the function names
> with lib section 6 is used
>
> 3. Other differences are that there is no debug section with dlltool and
> the text section comes first rather than last with lib (that probably
> doesn't matter much though)
>
> Please see attached notes.txt with objdump's of both libs
>
> Can could you give me your thoughts on this and how best we support both
> layouts in COFF/PECOFF ?
>
> What source files should I be looking at to patch this or is this
> something you can support with very little effort ?
>
> I don't know if you would be opposed to supporting this or not being
> honest dlltool should generate libs using the same section number as
> lib.exe but we can't exactly change that now because existing toolchains
> and libs have already been built with this and changing that would break
> them.
>
> If you are opposed I would like you to still tell me what I have to change
> to get it working after I do that I can narrow the scope for getting a
> patch up streamed into binutils to fix this :)
>
> Kind Regards
> Martell
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150723/8a676e7c/attachment.html>
-------------- next part --------------

There are 3 differences I can see from the 2 libs

1. With dlltool each object has the name of a compiled .o file this is the one it generates when building the code section
   With lib each object has the dll name 

2. With dlltool section 7 is used for the dll name and the function names with lib section 6 is used

3. Other differences are that there is no debug section with dlltool and the text section comes first rather than last with lib


llvm-objdump doesn't work on the msvc lib because it doesn't recogonise the machine type (0x14c)
which means it is intel x86 target luckily this is handled in binutils however :)

I'll submit a patch to llvm to fix all 4 targets for this x86 x64 arm and aarch64


Here are the 2 outputs from objdump

$ llvm-objdump -s libuser32.a

dykgt.o:        file format COFF-i386

Contents of section .idata$4:
 0000 00000000                             ....
Contents of section .idata$5:
 0000 00000000                             ....
Contents of section .idata$7:
 0000 55534552 33322e64 6c6c0000           USER32.dll..

dykgh.o:        file format COFF-i386

Contents of section .idata$2:
 0000 00000000 00000000 00000000 00000000  ................
 0010 00000000                             ....

dykgs00001.o:   file format COFF-i386

Contents of section .text:
 0000 ff250000 00009090                    .%......
Contents of section .idata$7:
 0000 00000000                             ....
Contents of section .idata$5:
 0000 00000000                             ....
Contents of section .idata$4:
 0000 00000000                             ....
Contents of section .idata$6:
 0000 01004d65 73736167 65426f78 5700      ..MessageBoxW.

dykgs00000.o:   file format COFF-i386

Contents of section .text:
 0000 ff250000 00009090                    .%......
Contents of section .idata$7:
 0000 00000000                             ....
Contents of section .idata$5:
 0000 00000000                             ....
Contents of section .idata$4:
 0000 00000000                             ....
Contents of section .idata$6:
 0000 00004d65 73736167 65426f78 4100      ..MessageBoxA.

$ objdump -s user32.lib
In archive user32.lib:

USER32.dll:     file format pe-i386

Contents of section .debug$S:
 0000 02000000 11000900 00000000 0a555345  .............USE
 0010 5233322e 646c6c27 00131007 00000003  R32.dll'........
 0020 00000000 0000000c 0000007d 79124d69  ...........}y.Mi
 0030 63726f73 6f667420 28522920 4c494e4b  crosoft (R) LINK
Contents of section .idata$2:
 0000 00000000 00000000 00000000 00000000  ................
 0010 00000000                             ....
Contents of section .idata$6:
 0000 55534552 33322e64 6c6c0000           USER32.dll..

USER32.dll:     file format pe-i386

Contents of section .debug$S:
 0000 02000000 11000900 00000000 0a555345  .............USE
 0010 5233322e 646c6c27 00131007 00000003  R32.dll'........
 0020 00000000 0000000c 0000007d 79124d69  ...........}y.Mi
 0030 63726f73 6f667420 28522920 4c494e4b  crosoft (R) LINK
Contents of section .idata$3:
 0000 00000000 00000000 00000000 00000000  ................
 0010 00000000                             ....

USER32.dll:     file format pe-i386

Contents of section .debug$S:
 0000 02000000 11000900 00000000 0a555345  .............USE
 0010 5233322e 646c6c27 00131007 00000003  R32.dll'........
 0020 00000000 0000000c 0000007d 79124d69  ...........}y.Mi
 0030 63726f73 6f667420 28522920 4c494e4b  crosoft (R) LINK
Contents of section .idata$5:
 0000 00000000                             ....
Contents of section .idata$4:
 0000 00000000                             ....

USER32.dll:     file format pei-i386

Contents of section .idata$4:
 0000 00000000                             ....
Contents of section .idata$5:
 0000 00000000                             ....
Contents of section .idata$6:
 0000 00004d65 73736167 65426f78 41000000  ..MessageBoxA...
Contents of section .text:
 0000 ff250000 00009090                    .%......

USER32.dll:     file format pei-i386

Contents of section .idata$4:
 0000 00000000                             ....
Contents of section .idata$5:
 0000 00000000                             ....
Contents of section .idata$6:
 0000 01004d65 73736167 65426f78 57000000  ..MessageBoxW...
Contents of section .text:
 0000 ff250000 00009090                    .%......


More information about the llvm-dev mailing list