Skip to content

mold 2.4.0

Compare
Choose a tag to compare
@rui314 rui314 released this 30 Nov 02:25
· 600 commits to main since this release

mold 2.4.0 is a new release of the high-speed linker.

New features

  • mold gained the --spare-program-headers=<number> option, which adds a specified number of spare entries at the end of the program header. The option aims to make post-processing tools to add program header entries very easily. Note that sorting program header entries after adding new ones may be necessary to meet the constraints of the ELF file format. For details, see the elf(5) man page. (eb6c213)
  • mold's -z rewrite-endbr option rewrites superflous endbr64 instructions with nop as a countermeasure against control-flow highjacking attacks. Previously, this worked exclusively with object files compiled with -ffunction-sections, requiring each function to be compiled into a separate section. Starting from this release, -z rewrite-endbr works on object files compiled without it. In other words, mold is now capable of rewriting endbr64 instructions even if the instruction is not at the beginning of a section. (3cb8a52)

Bug fixes and compatibility improvements

  • Previously, mold couldn't handle object files containing multiple .eh_frame sections. The .eh_frame is a section containing data for exception handling. Usually, an object file contains only one .eh_frame which describes how to handle exceptions for all text sections in the same file. However, on rare conditions, it seems ld -r creates an object file containing multiple .eh_frame sections. mold is now able to handle such object files. (f4c5a8a)
  • mold -run <command> is an easy way to run the given command with a virtual environment in which the ld command is replaced with mold. The feature is implemented using LD_PRELOAD to hook fork(2)-family functions. Before this release, some invocations of ld were not intercepted correctly because we missed the posix_spawnp(2) function. Now, the function is intercepted just like other fork(2)-family functions. (3fd1cec)
  • mold used to produce a non-working executable on a rare occasion when all thread-local variables lacked an initial value and the read-only data required alignment equal to or greater than the page size. This bug has been resolved. (de7d37e)
  • Previously, mold might assign a different symbol version to a symbol compared to GNU ld if it matches both a wildcard pattern and an exact pattern in a version script. Our behavior is now compatible with that of GNU ld. (0fdbace)
  • [x86-64, i686] Recent versions of LLVM emit a machine code sequence for TLSDESC thread-local variables that differs from GCC's, and mold previously mis-optimized this sequence, leading to crashes in the linked programs. In other words, if you are using LLVM/Clang and compile object files with -mtls-dialect=gnu2, mold might mis-optimize the output file. Now, the bug has been fixed. (000ce0e)

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'd like to acknowledge the following organizations and people who have sponsored $32/mo or more during this release cycle: