[llvm-dev] Invoking lld for PE/COFF (Windows) linking
Edward Diener via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 29 14:23:19 PDT 2017
On 3/29/2017 4:59 PM, Edward Diener via llvm-dev wrote:
> On 3/29/2017 1:38 PM, Reid Kleckner via llvm-dev wrote:
>> If clang is targeting VC++, then -fuse-ld=lld should be enough to make
>> it run lld-link.exe, and you won't need to set the flavor or do anything
>> special to get PE/COFF files.
>
> I build LLVM/cClang/lld with mingw-64/gcc-6.3, not with VC++.
Of course that should be:
"I build LLVM/clang/lld with mingw-64/gcc-6.3, not with VC++."
> If I
> compile with clang using the target triple of "-target
> i686-pc-windows-msvc" and "-fmsc-version=1900" for VC++14, the
> compilation is successful and clang creates a VC++ compatible object
> file. If I subsequently link using clang++ with link option
> "-fuse-ld=lld" I get as output:
>
> "lld: error: Windows targets are not supported on the ELF frontend: i386pe"
>
> If I add the "-target i686-pc-windows-msvc" to the clang++ link command,
> the clang++ command just hangs and never completes.
>
>>
>> This example worked for me:
>>
>> $ cat t.cpp
>> #include <iostream>
>> int main() { std::cout << "hello world\n"; }
>>
>> $ clang++ t.cpp -fuse-ld=lld -o t.exe && ./t.exe
>> hello world
>>
>> Unfortunately, we don't have a GNU-ld compatible command line interface
>> for the COFF port of LLD, if that's what you're having trouble with.
>> This is something I personally think we should add, but don't have time
>> to pursue.
>>
>> On Wed, Mar 29, 2017 at 7:56 AM, Edward Diener via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> I build llvm/clang/lld from source on Windows using
>> mingw-64/gcc-6.3. I use clang++ both to test clang targeting gcc and
>> clang targeting VC++. When using clang targeting VC++ I use the
>> appropriate target triple when compiling and am trying to use lld to
>> link the object file(s) into an exe. To do that I use the clang
>> option "-fuse-ld=lld" when linking. According to the llvm doc on
>> using lld with PE/COFF on Windows at
>> https://lld.llvm.org/windows_support.html
>> <https://lld.llvm.org/windows_support.html>:
>>
>> "LLD supports Windows operating system. When invoked as lld-link.exe
>> or with -flavor link, the driver for Windows operating system is
>> used to parse command line options, and it drives further linking
>> processes. LLD accepts almost all command line options that the
>> linker shipped with Microsoft Visual C++ (link.exe) supports."
>>
>> Unfortunately with clang++ attempting to use "-fuse-ld=lld-link"
>> when linking outputs:
>>
>> "clang++.exe: error: unsupported value 'lld_link' for -linker option"
>>
>> So I must use "-fuse-ld=lld". Does this mean that I should be
>> passing "-flavor link" to the lld linker ? If so, how do I do that ?
>> If not, what do I do to have lld work with PE/COFF linking rather
>> than ELF linking ?
>>
>> I have attempted to pass to the clang++ when linking:
>>
>> 1) "-flavor link", which outputs:
>> clang++.exe: error: unknown argument: '-flavor'
>> clang++.exe: error: no such file or directory: 'link'
>>
>> 2) -flavor=link", which outputs:
>> clang++.exe: error: unknown argument: '-flavor=link'
>>
>> 3) -Wl,-flavor,link, which outputs
>> C:\Programming\VersionControl\bninja_installed_clang\bin\lld: error:
>> unknown argument: -flavor
>>
>> 4) -Wl,-flavor=link, which outputs
>> C:\Programming\VersionControl\bninja_installed_clang\bin\lld: error:
>> unknown argument: -flavor=link
>>
>> What is the "magic" invocation that will allow me to invoke the lld
>> linker from the clang++ command, but get the linker to work in
>> PE/COFF mode rather than in ELF mode, so it will link object files
>> created by clang targeting VC++ ?
More information about the llvm-dev
mailing list