| ```{raw} html |
| <style type="text/css"> |
| .none { background-color: #FFCCCC } |
| .partial { background-color: #FFFF99 } |
| .good { background-color: #CCFF99 } |
| </style> |
| ``` |
| |
| ```{eval-rst} |
| .. role:: none |
| .. role:: partial |
| .. role:: good |
| ``` |
| |
| # Windows support |
| |
| 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. |
| |
| The current status is that LLD is used to link production builds of large |
| real-world binaries such as Firefox and Chromium. |
| |
| ## Development status |
| |
| Driver |
| : {good}`Mostly done`. Some exotic command line options that are not usually |
| used for application development, such as `/DRIVER`, are not supported. |
| |
| Linking against DLL |
| : {good}`Done`. LLD can read import libraries needed to link against DLL. Both |
| export-by-name and export-by-ordinal are supported. |
| |
| Linking against static library |
| : {good}`Done`. The format of static library (.lib) on Windows is actually the |
| same as on Unix (.a). LLD can read it. |
| |
| Creating DLL |
| : {good}`Done`. LLD creates a DLL if `/DLL` option is given. Exported |
| functions can be specified either via command line (`/EXPORT`) or via |
| module-definition file (.def). Both export-by-name and export-by-ordinal are |
| supported. |
| |
| Windows resource files support |
| : {good}`Done`. If an `.res` file is given, LLD converts the file to a COFF |
| file using LLVM's Object library. |
| |
| Safe Structured Exception Handler (SEH) |
| : {good}`Done` for both x86 and x64. |
| |
| Module-definition file |
| : {partial}`Partially done`. LLD currently recognizes these directives: |
| `EXPORTS`, `HEAPSIZE`, `STACKSIZE`, `NAME`, and `VERSION`. |
| |
| Debug info |
| : {good}`Done`. LLD can emit PDBs that are at parity with those generated by |
| link.exe. However, LLD does not support /DEBUG:FASTLINK. |
| |
| ## Downloading LLD |
| |
| The Windows version of LLD is included in the [pre-built binaries of LLVM's |
| releases](https://releases.llvm.org/download.html) and in the [LLVM Snapshot |
| Builds](https://llvm.org/builds/). |
| |
| ## Building LLD |
| |
| ### Using Visual Studio IDE/MSBuild |
| |
| 1. Check out LLVM and LLD from the LLVM SVN repository (or Git mirror), |
| 2. run `cmake -G "Visual Studio 12" <llvm-source-dir>` from VS command prompt, |
| 3. open LLVM.sln with Visual Studio, and |
| 4. build `lld` target in `lld executables` folder |
| |
| Alternatively, you can use msbuild if you don't like to work in an IDE: |
| |
| ``` |
| msbuild LLVM.sln /m /target:"lld executables\lld" |
| ``` |
| |
| MSBuild.exe had been shipped as a component of the .NET framework, but since |
| 2013 it's part of Visual Studio. You can find it at "C:\\Program Files |
| (x86)\\msbuild". |
| |
| You can build LLD as a 64-bit application. To do that, open VS2013 x64 command |
| prompt and run cmake for "Visual Studio 12 Win64" target. |
| |
| ### Using Ninja |
| |
| 1. Check out LLVM and LLD from the LLVM SVN repository (or Git mirror), |
| 2. run `cmake -G ninja <llvm-source-dir>` from VS command prompt, |
| 3. run `ninja lld` |
| |
| ## Extensions |
| |
| ### LLD flags |
| |
| - `/build-id`: Always generate GUID hash. When PDB is generated, LLD uses PDB |
| content hash for GUID. Otherwise, LLD uses output binary content hash for GUID. |
| LLD also provides `__buildid` symbol pointing to the 16 bytes GUID hash if |
| there is a reference to it. |