[llvm-dev] trying to get a minimal windows program linked with lld

Andrew Kelley via llvm-dev llvm-dev at lists.llvm.org
Mon Jun 5 06:22:04 PDT 2017


I'm using the release version, but yesterday on IRC Shoaib reproduced the
issue with trunk.

On Jun 5, 2017 8:32 AM, "Rui Ueyama" <ruiu at google.com> wrote:

Hi Andrew,

Are you using the release version of LLD 4.0 or the SVN head? I recently
made a change to the import table structure after the 4.0 release, and I'm
wondering if it caused the issue.

On Sun, Jun 4, 2017 at 2:50 PM, Shoaib Meenai <smeenai at fb.com> wrote:

> Oops; I forgot that attachments wouldn't work.
> https://www.dropbox.com/s/jrdbljl1q1nv5dy/kernel32.lib?dl=1
>
> On 6/4/17, 2:46 PM, "llvm-dev on behalf of Shoaib Meenai via llvm-dev" <
> llvm-dev-bounces at lists.llvm.org on behalf of llvm-dev at lists.llvm.org>
> wrote:
>
>     +ruiu and compnerd, since there might be an lld issue here.
>
>     A slightly simpler example. This is all x86_64; I haven't tried x86.
>
>     % cat imp.c
>     __declspec(dllimport) void ExitProcess(unsigned exitCode);
>     int mainCRTStartup() { ExitProcess(0); }
>
>     % cat kernel32.def
>     LIBRARY kernel32
>     EXPORTS
>       ExitProcess
>
>     % dlltool –d kernel32.def –l kernel32.lib
>     % cl /Zl /c imp.c
>     % link /subsystem:console imp.obj kernel32.lib
>
>     The above executable runs successfully, as does one compiled with ld:
>     % ld --version
>     GNU ld (GNU Binutils) 2.28
>     % ld imp.obj kernel32.lib
>
>     If we compile with lld, however:
>     % lld-link /subsystem:console /entry:mainCRTStartup imp.obj
> kernel32.lib
>
>     The resulting executable segfaults, and it doesn't actually have any
> imports:
>     % llvm-readobj -coff-imports imp.exe
>     File: imp.exe
>     Format: COFF-x86-64
>     Arch: x86_64
>     AddressSize: 64bit
>
>     Given that both link.exe and MinGW-w64's ld are able to handle the
> import
>     library correctly, I'm inclined to believe this is an issue with lld.
> I'm
>     attaching the kernel32.lib output by dlltool for ease of investigation.
>
>     From: llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf of Andrew
> Kelley via llvm-dev <llvm-dev at lists.llvm.org>
>     Reply-To: Andrew Kelley <superjoe30 at gmail.com>
>     Date: Sunday, June 4, 2017 at 1:15 PM
>     To: LLVM Dev <llvm-dev at lists.llvm.org>
>     Subject: Re: [llvm-dev] trying to get a minimal windows program linked
> with lld
>
>     Update: smeenai from #llvm has been helping me with this, and we
> narrowed it down to kernel32.lib being no good. kernel32.lib from the 14393
> SDK worked fine.
>
>     My goal is to not depend on .lib files from the SDK, so there's still
> a problem to solve here.
>
>     On Sun, Jun 4, 2017 at 3:33 PM, Andrew Kelley <superjoe30 at gmail.com>
> wrote:
>     Here's some C code:
>
>     extern void *GetStdHandle(unsigned int nStdHandle);
>     extern void ExitProcess(unsigned int exit_code);
>     extern char WriteFile(void *HANDLE, const void * lpBuffer, unsigned
> int nNumberOfBytesToWrite,
>         unsigned int *lpNumberOfBytesWritten, void *lpOverlapped);
>
>     static const char *message_ptr = "hello\n";
>     static const unsigned int message_len = 6;
>
>     __attribute__((stdcall)) int _start(void) {
>         void *hStdOut = GetStdHandle(-11);
>         WriteFile(hStdOut, message_ptr, message_len, 0, 0);
>         ExitProcess(0);
>     }
>
>
>     I use mingw-w64 like this:
>
>     gcc -c test.c
>
>
>     Create kernel32.def:
>
>     EXPORTS
>     ExitProcess
>     GetStdHandle
>     WriteFile
>
>
>     Use dlltool to create kernel32.lib:
>
>     dlltool -d kernel32.def -l kernel32.lib
>
>
>     Then link with lld-link:
>
>     lld-link -NOLOGO -SUBSYSTEM:console test.o kernel32.lib  -OUT:test.exe
> -NODEFAULTLIB -ENTRY:_start
>
>     This succeeds, but then I get a segfault when running test.exe. When I
> step through the code, what's happening is it's getting to
>         140005068:   ff 25 ce cf ff ff       jmpq   *-0x3032(%rip)
> # 0x14000203c
>     which is trying to jump into .idata section where presumably the stub
> for GetStdHandle lives. However after this jump, $rip ends up getting
> assigned a bogus address and then the segfault happens.
>
>     Any ideas how to make these library calls hook up correctly?
>
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170605/c10beac0/attachment-0001.html>


More information about the llvm-dev mailing list