=========================== lld |release| Release Notes =========================== .. contents:: :local: .. only:: PreRelease .. warning:: These are in-progress notes for the upcoming LLVM |release| release. Release notes for previous releases can be found on `the Download Page <https://releases.llvm.org/download.html>`_. Introduction ============ This document contains the release notes for the lld linker, release |release|. Here we describe the status of lld, including major improvements from the previous release. All lld releases may be downloaded from the `LLVM releases web site <https://llvm.org/releases/>`_. Non-comprehensive list of changes in this release ================================================= ELF Improvements ---------------- * ``--fat-lto-objects`` option is added to support LLVM FatLTO. Without ``--fat-lto-objects``, LLD will link LLVM FatLTO objects using the relocatable object file. (`D146778 <https://reviews.llvm.org/D146778>`_) * ``-Bsymbolic-non-weak`` is added to directly bind non-weak definitions. (`D158322 <https://reviews.llvm.org/D158322>`_) * ``--lto-validate-all-vtables-have-type-infos``, which complements ``--lto-whole-program-visibility``, is added to disable unsafe whole-program devirtualization. ``--lto-known-safe-vtables=<glob>`` can be used to mark known-safe vtable symbols. (`D155659 <https://reviews.llvm.org/D155659>`_) * ``--save-temps --lto-emit-asm`` now derives ELF/asm file names from bitcode file names. ``ld.lld --save-temps a.o d/b.o -o out`` will create ELF relocatable files ``out.lto.a.o``/``d/out.lto.b.o`` instead of ``out1.lto.o``/``out2.lto.o``. (`#78835 <https://github.com/llvm/llvm-project/pull/78835>`_) * ``--no-allow-shlib-undefined`` now reports errors for DSO referencing non-exported definitions. (`#70769 <https://github.com/llvm/llvm-project/pull/70769>`_) * common-page-size can now be larger than the system page-size. (`#57618 <https://github.com/llvm/llvm-project/issues/57618>`_) * When call graph profile information is available due to instrumentation or sample PGO, input sections are now sorted using the new ``cdsort`` algorithm, better than the previous ``hfsort`` algorithm. (`D152840 <https://reviews.llvm.org/D152840>`_) * Symbol assignments like ``a = DEFINED(a) ? a : 0;`` are now handled. (`#65866 <https://github.com/llvm/llvm-project/pull/65866>`_) * ``OVERLAY`` now supports optional start address and LMA (`#77272 <https://github.com/llvm/llvm-project/pull/77272>`_) * Relocations referencing a symbol defined in ``/DISCARD/`` section now lead to an error. (`#69295 <https://github.com/llvm/llvm-project/pull/69295>`_) * For AArch64 MTE, global variable descriptors have been implemented. (`D152921 <https://reviews.llvm.org/D152921>`_) * ``R_AARCH64_GOTPCREL32`` is now supported. (`#72584 <https://github.com/llvm/llvm-project/pull/72584>`_) * ``R_LARCH_PCREL20_S2``/``R_LARCH_ADD6``/``R_LARCH_CALL36`` and extreme code model relocations are now supported. * ``--emit-relocs`` is now supported for RISC-V linker relaxation. (`D159082 <https://reviews.llvm.org/D159082>`_) * Call relaxation respects RVC when mixing +c and -c relocatable files. (`#73977 <https://github.com/llvm/llvm-project/pull/73977>`_) * ``R_RISCV_GOT32_PCREL`` is now supported. (`#72587 <https://github.com/llvm/llvm-project/pull/72587>`_) * ``R_RISCV_SET_ULEB128``/``R_RISCV_SUB_ULEB128`` relocations are now supported. (`#72610 <https://github.com/llvm/llvm-project/pull/72610>`_) (`#77261 <https://github.com/llvm/llvm-project/pull/77261>`_) * RISC-V TLSDESC is now supported. (`#79239 <https://github.com/llvm/llvm-project/pull/79239>`_) Breaking changes ---------------- COFF Improvements ----------------- * Added support for ``--time-trace`` and associated ``--time-trace-granularity``. This generates a .json profile trace of the linker execution. (`#68236 <https://github.com/llvm/llvm-project/pull/68236>`_) * The ``-dependentloadflag`` option was implemented. (`#71537 <https://github.com/llvm/llvm-project/pull/71537>`_) * LLD now prefers library paths specified with ``-libpath:`` over the implicitly detected toolchain paths. (`#78039 <https://github.com/llvm/llvm-project/pull/78039>`_) * Added new options ``-lldemit:llvm`` and ``-lldemit:asm`` for getting the output of LTO compilation as LLVM bitcode or assembly. (`#66964 <https://github.com/llvm/llvm-project/pull/66964>`_) (`#67079 <https://github.com/llvm/llvm-project/pull/67079>`_) * Added a new option ``-build-id`` for generating a ``.buildid`` section when not generating a PDB. A new symbol ``__buildid`` is generated by the linker, allowing code to reference the build ID of the binary. (`#71433 <https://github.com/llvm/llvm-project/pull/71433>`_) (`#74652 <https://github.com/llvm/llvm-project/pull/74652>`_) * A new, LLD specific option, ``-lld-allow-duplicate-weak``, was added for allowing duplicate weak symbols. (`#68077 <https://github.com/llvm/llvm-project/pull/68077>`_) * More correctly handle LTO of files that define ``__imp_`` prefixed dllimport redirections. (`#70777 <https://github.com/llvm/llvm-project/pull/70777>`_) (`#71376 <https://github.com/llvm/llvm-project/pull/71376>`_) (`#72989 <https://github.com/llvm/llvm-project/pull/72989>`_) * Linking undefined references to weak symbols with LTO now works. (`#70430 <https://github.com/llvm/llvm-project/pull/70430>`_) * Use the ``SOURCE_DATE_EPOCH`` environment variable for the PE header and debug directory timestamps, if neither the ``/Brepro`` nor ``/timestamp:`` options have been specified. This makes the linker output reproducible by setting this environment variable. (`#81326 <https://github.com/llvm/llvm-project/pull/81326>`_) * Lots of incremental work towards supporting linking ARM64EC binaries. MinGW Improvements ------------------ * Added support for many LTO and ThinLTO options (most LTO options supported by the ELF driver, that are implemented by the COFF backend as well, should be supported now). (`D158412 <https://reviews.llvm.org/D158412>`_) (`D158887 <https://reviews.llvm.org/D158887>`_) (`#77387 <https://github.com/llvm/llvm-project/pull/77387>`_) (`#81475 <https://github.com/llvm/llvm-project/pull/81475>`_) * LLD no longer tries to autodetect and use library paths from MSVC/WinSDK installations when run in MinGW mode; that mode of operation shouldn't ever be needed in MinGW mode, and could be a source of unexpected behaviours. (`D144084 <https://reviews.llvm.org/D144084>`_) * The ``--icf=safe`` option now works as expected; it was previously a no-op. (`#70037 <https://github.com/llvm/llvm-project/pull/70037>`_) * The strip flags ``-S`` and ``-s`` now can be used to strip out DWARF debug info and symbol tables while emitting a PDB debug info file. (`#75181 <https://github.com/llvm/llvm-project/pull/75181>`_) * The option ``--dll`` is handled as an alias for the ``--shared`` option. (`#68575 <https://github.com/llvm/llvm-project/pull/68575>`_) * The option ``--sort-common`` is ignored now. (`#66336 <https://github.com/llvm/llvm-project/pull/66336>`_) MachO Improvements ------------------ WebAssembly Improvements ------------------------ * Indexes are no longer required on archive files. Instead symbol information is read from object files within the archive. This matches the behaviour of the ELF linker. SystemZ ------- * Add target support for SystemZ (s390x). Fixes #####