Releases: rui314/mold
mold 2.41.0
mold 2.41.0 is a new release of the high-speed linker. It includes the following new features and bug fixes.
New Features
-
A new
--zero-to-bssoption has been added. When given, mold scans input data sections and converts all-zero sections into BSS (SHT_NOBITS), reducing output file size. This is especially useful for user-defined sections created with__attribute__((section(...)))containing uninitialized global variables, which GCC and Clang emit as regular data sections even when their contents are entirely zero. (847341d) -
--print-gc-sectionsand--print-icf-sectionscan now take=FILEto save their output to a file (e.g.,--print-gc-sections=output.txt). (7dd7db0) -
A new
MOLD_TARGETSCMake variable has been added that allows building mold with a limited set of supported targets to reduce build time. The use of this variable is discouraged unless you build mold frequently for personal use; distributions should not use it. (dce9ac1) -
--gdb-indexperformance has been improved by eliminating unnecessary zero-initializations and parallelizing more of the index generation. (a4db238)
Bug Fixes and Compatibility Improvements
-
Fixed spurious "duplicate symbol" errors when linking with LTO. Archive members extracted pre-LTO could conflict with LTO output, causing false positives. (632a0ee)
-
Fixed
--omagicto pack all sections into a singlePT_LOADsegment, matching GNU ld behavior. Previously, it only flipped permissions to RWX but still emitted separate page-aligned segments.--omagicnow also implies--Bstaticand disables RELRO. (a1ae8da) -
Fixed corruption of the string table in separate debug files generated by
--separate-debug-file, which caused GDB to refuse to load them or display corrupt symbol entries. (4cd4d56) -
Fixed
--separate-debug-fileemitting a bogus "PHDR" section in the debug file. (4798f43) -
Fixed
--no-allow-shlib-undefinedto correctly reject symbols provided by static objects with hidden visibility, and to avoid false positives when LTO optimizes away symbols that are still available from loaded shared libraries. (f6bb117) -
Fixed
--push-state/--pop-statenot correctly tracking the--staticflag. (001f718) -
Fixed linker script processing to support
AS_NEEDEDinsideINPUTorGROUPcommands, which is used by GCC 16'slibatomiclinker script. (e0a6f8e) -
Fixed a performance issue where
fallocateon tmpfs was unexpectedly slow (nearly a second for a ~5 GiB file). mold now avoids callingfallocateon tmpfs. (fc96c1b) -
Fixed RELRO segment alignment when
-z separate-loadable-segmentis given. The end of the RELRO segment is now properly page-aligned so the runtime can protect it. (9f463a6) -
Fixed an issue where an IFUNC PLT entry was unnecessarily created in position-dependent executables when the ifunc was not referenced within the executable. (3ad34d4)
-
Improved LTO compatibility: mold now falls back to native code for GCC fat LTO objects when using the LLVM LTO plugin, and correctly preserves non-LTO comdat members in mixed LTO/non-LTO builds. (2a1e5c6, a660037, d4d5eae)
-
--no-threadsis now respected with--compress-debug-sections. (fce89c2) -
--section-ordernow reports an error if the specified order would cause section addresses to go backward. (91439be) -
ICF now considers
.gcc_except_tablesections, improving deduplication accuracy for functions with exception handling. (fd86590) -
Replaced an uninformative
abort()with a descriptive error message when mold auto-detects an unsupported target. (93e1aea) -
[AArch64] Added support for
R_AARCH64_GOTPCREL32relocation, used by Clang's experimental relative C++ ABI vtables. (be28db1) -
[RISC-V] Added support for
R_RISCV_GOT32_PCRELrelocation. (f378b18) -
[PPC32] Added support for
R_PPC_DTPREL32in non-allocatable sections. (0b20faa) -
[SPARC64] Fixed multiple TLS optimization bugs, including incorrect register handling in
R_SPARC_TLS_GD_ADD,R_SPARC_TLS_GD_LO10, andTLS_GD_CALLtransformations, and fixedR_SPARC_GOTDATA_OPassuming the destination register is always%g1. (92adbb1, a16bb13, ca0b597, a88a216, 4d94410, 069f4da, e459ed5) -
[SPARC64] Added support for emitting dynamic relocations for
R_SPARC_UA64. (f55ad91) -
[SPARC]
--no-apply-dynamic-relocsis now honored forR_SPARC_UA64. (7f8c50b)
Acknowledgements
mold is an open-source project, and we accept donations via GitHub Sponsors and OpenCollective. We thank everyone who sponsors our project. In particular, we would like to acknowledge the following organizations and people who have sponsored $32/month or more during this release cycle:
- Cybozu, Inc.
- Mercedes-Benz Group
- Signal Slot Inc.
- Mercury
- G-Research Open Source Software
- kraptor23
- Pedro Navarro
- Jinkyu Yi
- SAP
- Ahrefs
- CubeSoft, Inc.
- Wei Wu
- daquexian
- Josh Triplett
- nomeaning
- Bach Le
- David Wells
- Martin LiΕ‘ka
- Sebastian DrΓΆge
- Jordan Miner
- Anson VanDoren
- Niklas GΓΆgge
- Michal R
- Florian Plattner
- Victor Wang
- Bert Muthalaly
- TSY Capital
- Michael McLoughlin
- Brian Gianforcaro
- strager
- Julian Braha
- Zhihao Yuan
- Yutaro Ohno
- JosΓ© M Rico
- Vladimir Miloserdov
- Artem Pianykh
- Taiju Muto
- Matt Heise
- Eric Semeniuc
- Yuxuan Chen
- Thomas Eizinger
- Kiril Mihaylov
- Tatsuya Kawano
- Rahul Butani
- Kyle Lacy
- Andrew McNulty
- kimonohanger
- Tetsuo Kiso
- Khyber Sen
- JoJo
- Martin Nordholts
- Nazar Mokrynskyi
- Max Bruckner
- Geoff Hill
- Marc LuquΓ©
- Daniel Alley
mold 2.40.4
mold 2.40.4 is a maintenance release of the high-speed linker.
Bug Fixes and Compatibility Improvements
- We had upgraded the bundled mimalloc memory allocator library to version 3.3.3 in the mold 2.40.3 release, but it turned out that this version of mimalloc was not stable enough. We have rolled it back, so mold is now shipped with mimalloc 2.2.2. (754949f)
- [PPC64V1]
R_PPC64_GOT16relocation is now supported. (7e0b728) - [PPC64V2]
R_PPC64_REL14relocation is now supported. (d9b20a1)
mold 2.40.3
mold 2.40.3 is a maintenance release of the high-speed linker.
Bug Fixes and Compatibility Improvements
- Starting from 2.40.1, mold wrote not a single but multiple concatenated zlib-compressed streams to debug sections if
--compress-debug-sections=zlibwas given. Although most tools can read such concatenated compressed data, some tools, such as LLVM'sdwarfdumpor Go'sdebug/elfpackage, couldn't handle them, which caused a regression. Now, mold emits a single zlib stream to each debug section. (201bc71) - If a command-line argument is in the form of
@path/to/some/file, the linker reads the contents of the given file and interprets it as a list of command-line arguments. Such a file is called a "response file." Previously, mold could not handle partially-quoted tokens in a response file (e.g.-L"some/path"as opposed to"-Lsome/path"). Now, mold can handle such arguments. (6e8852e) - [PPC64]
R_PPC64_GOT16*relocations are now supported. (5485fde)
mold 2.40.2
mold 2.40.2 is a maintenance release of the high-speed linker.
Bug Fixes and Compatibility Improvements
- Fixed an issue where mold failed with a "too many open files" error when linking a very large program with LTO using Clang. (1956ae6)
- [RISC-V] Fixed an issue in which mold failed to report a relocation overflow error. (52c698d)
- [ARM64] mold can now create range extension thunks with displacements greater than 2^32 bytes. (47f6c28)
mold 2.40.1
mold 2.40.1 is a maintenance release of the high-speed linker. Although there are no new features in this release, it includes a few performance improvements as below.
Performance improvements
- We've eliminated unnecessary memory zero-initialization for the
--compress-debug-sectionsoption to make debug section compression faster. With this change, mold sometimes runs faster with--compress-debug-sectionsthan without it due to reduced file I/O. (d59c559) - Previously, mold used an exponential pattern-matching algorithm for glob matching, which could significantly slow down version scripts or dynamic list processing for certain glob patterns. Now, we use a linear-time algorithm that is guaranteed to run efficiently for any glob pattern. (dac20fa)
Bug Fixes and Compatibility Improvements
- mold now reports an error if the output
.dynsymrefers to a section whose section index is β₯65280, since such a dynamic symbol is not representable in ELF. Previously, mold crashed with an assertion failure. (0d8334e)
mold 2.40.0
mold 2.40.0 is a new release of the high-speed linker. It includes the following new features and bug fixes.
New Features
-
mold now lays out DWARF32 debug info before DWARF64 in output debug sections to mitigate relocation overflow issues with DWARF32 when a debug info section exceeds 4 GiB. This should help people who are building extremely large executables in debug mode. (19a1bc6, 159ce3b)
Here are the details: By default, GCC and Clang emit DWARF32 even for 64-bit code. That is, the debug info typically uses 32 bit offsets to refer to locations in other debug info sections while it uses 64 bits to represent addresses. This imposes a limitation on the largest offset DWARF32 debug info can refer to, which is 4 GiB. If the output debug section exceeds that size, the linker may report a relocation overflow error. You can instruct the compilers to emit DWARF64, which uses 64 bits for inter-debug info references, if you are building an extremely large executable. So, the proper fix for the relocation overflow issue is to build all object files with
-gdwarf64. However, rebuilding all static libraries with the new compiler flag is not always feasible for various reasons. This new feature mitigates the issue by placing DWARF32 at the beginning of output debug info sections, followed by DWARF64. By doing so, relocation overflow can be prevented as long as the total size of DWARF32 remains under 4 GiB, allowing users to continue using object files compiled without-gdwarf64in very large executables.Note that mold only sorts debug section contents when their size exceeds 4 GiB. Therefore, for most outputs, this mitigation doesn't change the result at all.
Bug Fixes and Compatibility Improvements
- Fixed a regression introduced in 2.38.0 in which a thread-local variable with an unusually large alignment might not have been aligned properly. That caused mislinking of systemd when LTO was enabled (#1463). (53c1758)
- Fixed a regression introduced in 2.38.0 in which
--as-neededwas ignored when creating an executable under a rare condition. (af36625) - Fixed an assertion failure on some targets that is triggered when an weak undefined symbol in an executable is promoted to a dynamic symbol with the
-z dynamic-undefined-weakoption. (0fdffad) - mold now ignores
--dynamic-linkerif-staticis given. The new behavior is compatible with GNU ld. (c13ecc9)
Acknowledgements
mold is an open-source project, and we accept donations via GitHub Sponsors and OpenCollective. We thank everyone who sponsors our project. In particular, we would like to acknowledge the following organizations and people who have sponsored $32/month or more during this release cycle:
mold 2.39.1
mold 2.39.1 is a maintenance release of the high-speed linker. It includes the following bug fix:
- Fixed a potential use-after-free issue that occurred when doing LTO (link-time optimization) with LLVM. (d0dffd5)
mold 2.39.0
mold 2.39.0 is a new release of the high-speed linker. It includes the following new features and bug fixes.
New Features
-
[ARM32] Support for 32-bit big-endian ARM has been added. Although running ARM32 in big-endian mode is very rare, the processor does technically support both little- and big-endian modes, and we now support both.
There are two variants of big-endian mode for ARM32: BE32 and BE8. BE32 is now obsolete and uses big-endian format for both instructions and data. In BE8, instructions are always in little-endian (i.e., the same as little-endian ARM32), while only the data is in big-endian. mold supports only BE8 output. (157b16a)
Bug Fixes and Compatibility Improvements
-
Fixed a spurious
--no-allow-shlib-undefinederror. (3274bcb) -
[ARM][PPC] Fixed a regression introduced in 2.38.0 that mold could crash when linking a large program. (fded2d8)
-
Previously,
--default-symverdidn't set versions to symbols if the symbols were marked asglobal:in a version script. Now,--default-symvercorrectly version all symbols with the soname of the output file. (8bae43b) -
[RISC-V] Fixed an issue where mold reported an error on
R_RISCV_32when the target was 64-bit RISC-V. (564757a) -
[RISC-V] Fixed an issue where a call to an weak undefined symbol within the same shared library was mistakenly turned into an infinite loop. Now, such calls are promoted to a function call through the PLT entry. (e08e7f6)
-
Fixed an issue that mold falls into an infinite loop in a rare occasion when computing an address of the program header. (83dd353)
Acknowledgements
mold is an open-source project, and we accept donations via GitHub Sponsors and OpenCollective. We thank everyone who sponsors our project. In particular, we would like to acknowledge the following organizations and people who have sponsored $32/month or more during this release cycle:
mold 2.38.1
mold 2.38.1 is a maintenance release of the high-speed linker. It includes the following bug fix:
- Fixed a bug where mold could fail with a spurious
mutually-recursive .so detectederror message when building an executable. This happened if there was a circular dependency between shared libraries given to the linker (i.e., libfoo.so depends on libbar.so and vice versa). Even though libraries with circular dependencies are rare and a strong indication of a bug in the original program's library layering, the dynamic loader can load such libraries, and the linker shouldn't reject them. (21e20e0)
mold 2.38.0
mold 2.38.0 is a new release of the high-speed linker. It includes the following new features and bug fixes.
New Features
-
The
--auditand--depauditoptions are now supported for compatibility with GNU ld. (af396ad) -
Recent versions of LLVM support an alternative, experimental relocation table format called CREL. mold can now read object files containing CREL relocation tables. (c43a859)
-
[ARM32][ARM64][PPC32][PPC64] The branch instruction ranges of RISC processors are generally insufficient to support the medium code model because their instructions are typically 32 bits long, which makes it impossible to embed large immediate offsets. For example, ARM64βs branch instruction can target only PC Β± 128 MiB. If the branch target is farther than that, the linker must emit a small piece of codeβoften called a thunk or branch islandβto extend the branch range.
Previously, mold created unnecessary range extension thunks for symbols that had PLT entries. Now, mold does not create thunks unless they are truly needed. (a43f395)
Bug Fixes and Compatibility Improvements
-
Previously,
--no-allow-shlib-undefinedcould cause a segmentation fault due to an out-of-bounds array access. This has been fixed. (82affb9) -
--no-allow-shlib-undefinedis enabled by default if the output type is an executable (as opposed to a shared library) for compatibility with other linkers. (43810df) -
mold could report a spurious "duplicate symbol" error when performing LTO. This bug has been fixed. (5d24db5)
-
In rare cases involving symbol versioning, mold mistakenly filtered out necessary libraries specified with
--as-needed. This bug has been fixed. (a97a628) -
In rare cases involving symbol versioning, mold reported a spurious "undefined symbol" error. This bug has been fixed. (2d6061a)
-
If the same symbol was defined with and without the default version (e.g., if an object file defined both
fooandfoo@@VERSION), mold mistakenly hid both symbols from the dynamic symbol table instead of exporting the default one (e.g.,foo@@VERSION). This bug has been fixed. (ac6f1ec)
Acknowledgements
mold is an open-source project, and we accept donations via GitHub Sponsors and OpenCollective. We thank everyone who sponsors our project. In particular, we would like to acknowledge the following organizations and people who have sponsored $32/month or more during this release cycle: