| ======================= |
| lld 9.0.0 Release Notes |
| ======================= |
| |
| .. contents:: |
| :local: |
| |
| Introduction |
| ============ |
| |
| lld is a high-performance linker that supports ELF (Unix), COFF |
| (Windows), Mach-O (macOS), MinGW and WebAssembly. lld is |
| command-line-compatible with GNU linkers and Microsoft link.exe and is |
| significantly faster than the system default linkers. |
| |
| lld 9 has lots of feature improvements and bug fixes. |
| |
| Non-comprehensive list of changes in this release |
| ================================================= |
| |
| ELF Improvements |
| ---------------- |
| |
| * ld.lld now has typo suggestions for flags: |
| ``$ ld.lld --call-shared`` now prints |
| ``unknown argument '--call-shared', did you mean '--call_shared'``. |
| (`r361518 <https://reviews.llvm.org/rL361518>`_) |
| |
| * ``--allow-shlib-undefined`` and ``--no-allow-shlib-undefined`` |
| options are added. ``--no-allow-shlib-undefined`` is the default for |
| executables. |
| (`r352826 <https://reviews.llvm.org/rL352826>`_) |
| |
| * ``-nmagic`` and ``-omagic`` options are fully supported. |
| (`r360593 <https://reviews.llvm.org/rL360593>`_) |
| |
| * Segment layout has changed. PT_GNU_RELRO, which was previously |
| placed in the middle of readable/writable PT_LOAD segments, is now |
| placed at the beginning of them. This change permits lld-produced |
| ELF files to be read correctly by GNU strip older than 2.31, which |
| has a bug to discard a PT_GNU_RELRO in the former layout. |
| |
| * ``-z common-page-size`` is supported. |
| (`r360593 <https://reviews.llvm.org/rL360593>`_) |
| |
| * Diagnostics messages have improved. A new flag ``--vs-diagnostics`` |
| alters the format of diagnostic output to enable source hyperlinks |
| in Microsoft Visual Studio IDE. |
| |
| * Linker script compatibility with GNU BFD linker has generally improved. |
| |
| * The clang ``--dependent-library`` form of autolinking is supported. |
| |
| This feature is added to implement the Windows-style autolinking for |
| Unix. On Unix, in order to use a library, you usually have to |
| include a header file provided by the library and then explicitly |
| link the library with the linker ``-l`` option. On Windows, header |
| files usually contain pragmas that list needed libraries. Compilers |
| copy that information to object files, so that linkers can |
| automatically link needed libraries. ``--dependent-library`` is |
| added for implementing that Windows semantics on Unix. |
| (`r360984 <https://reviews.llvm.org/rL360984>`_) |
| |
| * AArch64 BTI and PAC are supported. |
| (`r362793 <https://reviews.llvm.org/rL362793>`_) |
| |
| * lld now supports replacing ``JAL`` with ``JALX`` instructions in case |
| of MIPS-microMIPS cross-mode jumps. |
| (`r354311 <https://reviews.llvm.org/rL354311>`_) |
| |
| * lld now creates LA25 thunks for MIPS R6 code. |
| (`r354312 <https://reviews.llvm.org/rL354312>`_) |
| |
| * Put MIPS-specific .reginfo, .MIPS.options, and .MIPS.abiflags sections |
| into corresponding PT_MIPS_REGINFO, PT_MIPS_OPTIONS, and PT_MIPS_ABIFLAGS |
| segments. |
| |
| * The quality of RISC-V and PowerPC ports have greatly improved. Many |
| applications can now be linked by lld. PowerPC64 is now almost |
| production ready. |
| |
| * The Linux kernel for arm32_7, arm64, ppc64le and x86_64 can now be |
| linked by lld. |
| |
| * x86-64 TLSDESC is supported. |
| (`r361911 <https://reviews.llvm.org/rL361911>`_, |
| `r362078 <https://reviews.llvm.org/rL362078>`_) |
| |
| * DF_STATIC_TLS flag is set for i386 and x86-64 when needed. |
| (`r353293 <https://reviews.llvm.org/rL353293>`_, |
| `r353378 <https://reviews.llvm.org/rL353378>`_) |
| |
| * The experimental partitioning feature is added to allow a program to |
| be split into multiple pieces. |
| |
| The feature allows you to semi-automatically split a single program |
| into multiple ELF files called "partitions". Since all partitions |
| share the same memory address space and don't use PLT/GOT, split |
| programs run as fast as regular programs. |
| |
| With the mechanism, you can start a program only with a "main" |
| partition and load remaining partitions on-demand. For example, you |
| can split a web browser into a main partition and a PDF reader |
| sub-partition and load the PDF reader partition only when a user |
| tries to open a PDF file. |
| |
| See `the documentation <Partitions.html>`_ for more information. |
| |
| * If "-" is given as an output filename, lld writes the final result |
| to the standard output. Previously, it created a file "-" in the |
| current directory. |
| (`r351852 <https://reviews.llvm.org/rL351852>`_) |
| |
| * ``-z ifunc-noplt`` option is added to reduce IFunc function call |
| overhead in a freestanding environment such as the OS kernel. |
| |
| Functions resolved by the IFunc mechanism are usually dispatched via |
| PLT and thus slower than regular functions because of the cost of |
| indirection. With ``-z ifunc-noplt``, you can eliminate it by doing |
| text relocations at load-time. You need a special loader to utilize |
| this feature. This feature is added for the FreeBSD kernel but can |
| be used by any operating systems. |
| (`r360685 <https://reviews.llvm.org/rL360685>`_) |
| |
| * ``--undefined-glob`` option is added. The new option is an extension |
| to ``--undefined`` to take a glob pattern instead of a single symbol |
| name. |
| (`r363396 <https://reviews.llvm.org/rL363396>`_) |
| |
| |
| COFF Improvements |
| ----------------- |
| |
| * Like the ELF driver, lld-link now has typo suggestions for flags. |
| (`r361518 <https://reviews.llvm.org/rL361518>`_) |
| |
| * lld-link now correctly reports duplicate symbol errors for object |
| files that were compiled with ``/Gy``. |
| (`r352590 <https://reviews.llvm.org/rL352590>`_) |
| |
| * lld-link now correctly reports duplicate symbol errors when several |
| resource (.res) input files define resources with the same type, |
| name and language. This can be demoted to a warning using |
| ``/force:multipleres``. |
| (`r359829 <https://reviews.llvm.org/rL359829>`_) |
| |
| * lld-link now rejects more than one resource object input files, |
| matching link.exe. Previously, lld-link would silently ignore all |
| but one. If you hit this: Don't pass resource object files to the |
| linker, instead pass res files to the linker directly. Don't put |
| resource files in static libraries, pass them on the command line. |
| (`r359749 <https://reviews.llvm.org/rL359749>`_) |
| |
| * Having more than two ``/natvis:`` now works correctly; it used to not |
| work for larger binaries before. |
| (`r359515 <https://reviews.llvm.org/rL359515>`_) |
| |
| * Undefined symbols are now printed only in demangled form. Pass |
| ``/demangle:no`` to see raw symbol names instead. |
| (`r355878 <https://reviews.llvm.org/rL355878>`_) |
| |
| * Several speed and memory usage improvements. |
| |
| * lld-link now supports resource object files created by GNU windres and |
| MS cvtres, not only llvm-cvtres. |
| |
| * The generated thunks for delayimports now share the majority of code |
| among thunks, significantly reducing the overhead of using delayimport. |
| (`r365823 <https://reviews.llvm.org/rL365823>`_) |
| |
| * ``IMAGE_REL_ARM{,64}_REL32`` relocations are supported. |
| (`r352325 <https://reviews.llvm.org/rL352325>`_) |
| |
| * Range extension thunks for AArch64 are now supported, so lld can |
| create large executables for Windows/ARM64. |
| (`r352929 <https://reviews.llvm.org/rL352929>`_) |
| |
| * The following flags have been added: |
| ``/functionpadmin`` (`r354716 <https://reviews.llvm.org/rL354716>`_), |
| ``/swaprun:`` (`r359192 <https://reviews.llvm.org/rL359192>`_), |
| ``/threads:no`` (`r355029 <https://reviews.llvm.org/rL355029>`_), |
| ``/filealign`` (`r361634 <https://reviews.llvm.org/rL361634>`_) |
| |
| WebAssembly Improvements |
| ------------------------ |
| |
| * Imports from custom module names are supported. |
| (`r352828 <https://reviews.llvm.org/rL352828>`_) |
| |
| * Symbols that are in llvm.used are now exported by default. |
| (`r353364 <https://reviews.llvm.org/rL353364>`_) |
| |
| * Initial support for PIC and dynamic linking has landed. |
| (`r357022 <https://reviews.llvm.org/rL357022>`_) |
| |
| * wasm-ld now add ``__start_``/``__stop_`` symbols for data sections. |
| (`r361236 <https://reviews.llvm.org/rL361236>`_) |
| |
| * wasm-ld now doesn't report an error on archives without a symbol index. |
| (`r364338 <https://reviews.llvm.org/rL364338>`_) |
| |
| * The following flags have been added: |
| ``--emit-relocs`` (`r361635 <https://reviews.llvm.org/rL361635>`_), |
| ``--wrap`` (`r361639 <https://reviews.llvm.org/rL361639>`_), |
| ``--trace`` and ``--trace-symbol`` |
| (`r353264 <https://reviews.llvm.org/rL353264>`_). |
| |
| |
| MinGW Improvements |
| ------------------ |
| |
| * lld now correctly links crtend.o as the last object file, handling |
| terminators for the sections such as .eh_frame properly, fixing |
| DWARF exception handling with libgcc and gcc's crtend.o. |
| |
| * lld now also handles DWARF unwind info generated by GCC, when linking |
| with libgcc. |
| |
| * PDB output can be requested without manually specifying the PDB file |
| name, with the new option ``-pdb=`` with an empty value to the option. |
| (The old existing syntax ``-pdb <filename>`` was more cumbersome to use |
| with an empty parameter value.) |
| |
| * ``--no-insert-timestamp`` option is added as an alias to ``/timestamp:0``. |
| (`r353145 <https://reviews.llvm.org/rL353145>`_) |
| |
| * Many more GNU ld options are now supported, which e.g. allows the lld |
| MinGW frontend to be called by GCC. |
| |
| * The following options are added: ``--exclude-all-symbols``, |
| ``--appcontainer``, ``--undefined`` |