From b8c38f39aed1ef8ec467aad668b25a871c8ea3f7 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 25 Mar 2024 15:57:01 +0100 Subject: [PATCH] add mold --- technology/applications/development/mold.md | 58 +++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 technology/applications/development/mold.md diff --git a/technology/applications/development/mold.md b/technology/applications/development/mold.md new file mode 100644 index 0000000..71cd22a --- /dev/null +++ b/technology/applications/development/mold.md @@ -0,0 +1,58 @@ +--- +obj: application +repo: https://github.com/rui314/mold +rev: 2024-03-22 +--- + +# mold +mold is a faster drop-in replacement for existing Unix linkers. It is several times quicker than the LLVM lld linker, the second-fastest open-source linker, which I initially developed a few years ago. mold aims to enhance developer productivity by minimizing build time, particularly in rapid debug-edit-rebuild cycles. + +## Usage +### A classic way to use mold +On Unix, the linker command (usually `/usr/bin/ld`) is indirectly invoked by the compiler driver (typically `cc`, `gcc`, or `clang`), which is in turn indirectly invoked by `make` or other build system commands. + +If you can specify an additional command line option for your compiler driver by modifying the build system's config files, add one of the following flags to use mold instead of `/usr/bin/ld`: +- For Clang: pass `-fuse-ld=mold` +- For GCC 12.1.0 or later: pass `-fuse-ld=mold` +- For GCC before 12.1.0: the `-fuse-ld` option does not accept `mold` as a valid argument, so you need to use the `-B` option instead. The `-B` option tells GCC where to look for external commands like `ld`. + +If you have installed mold with `make install`, there should be a directory named `/usr/libexec/mold` (or `/usr/local/libexec/mold`, depending on your `$PREFIX`), and the `ld` command should be there. The `ld` is actually a symlink to `mold`. So, all you need is to pass `-B/usr/libexec/mold` (or `-B/usr/local/libexec/mold`) to GCC. + +If you haven't installed `ld.mold` to any `$PATH`, you can still pass `-fuse-ld=/absolute/path/to/mold` to clang to use mold. However, GCC does not accept an absolute path as an argument for `-fuse-ld`. + +### If you are using [Rust](../../dev/programming/languages/Rust.md) +Create `.cargo/config.toml` in your project directory with the following: + +```toml +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=-fuse-ld=/path/to/mold"] +``` + +where `/path/to/mold` is an absolute path to the mold executable. In the example above, we use `clang` as a linker driver since it always accepts the `-fuse-ld` option. If your GCC is recent enough to recognize the option, you may be able to remove the `linker = "clang"` line. + +```toml +[target.x86_64-unknown-linux-gnu] +rustflags = ["-C", "link-arg=-fuse-ld=/path/to/mold"] +``` + +If you want to use mold for all projects, add the above snippet to `~/.cargo/config.toml`. + +### [GitHub Actions](../../dev/GitHub%20Actions.md) +You can use our [setup-mold](https://github.com/rui314/setup-mold) GitHub Action to speed up GitHub-hosted continuous builds. Although [GitHub Actions](../../dev/GitHub%20Actions.md) run on a 4 core machine, mold is still significantly faster than the default GNU linker, especially when linking large programs. + +### Verify that you are using mold +mold leaves its identification string in the `.comment` section of an output file. You can print it out to verify that you are actually using mold. + +```shell +$ readelf -p .comment + +String dump of section '.comment': + [ 0] GCC: (Ubuntu 10.2.0-5ubuntu1~20.04) 10.2.0 + [ 2b] mold 9a1679b47d9b22012ec7dfbda97c8983956716f7 +``` + +If `mold` is present in the `.comment` section, the file was created by mold. + +### Documentation +Since mold is a drop-in replacement, you should be able to use it without reading its manual. However, if you need it, [mold's man page](https://github.com/rui314/mold/blob/main/docs/mold.md) is available online. You can read the same manual by running `man mold`. \ No newline at end of file