プログラミング
Mold Linker バージョン 3.0.0 リリース – Rustで書き直し
Mold Linker Version 3.0.0 Release – Rewritten in Rust (github.com)
要約
高速リンカMoldのメジャーバージョン3.0.0がリリースされました。このバージョンでは、MoldがC++からRustに完全に書き直され、最初のRust版リリースとなります。主な目標は、GNU ldとの互換性ギャップを埋め、Linuxディストリビューションでのデフォルトリンカとしての採用を目指すことです。Rustへの移行により、安全性とパフォーマンスは維持されつつ、ビルドシステムが変更されています。
全文翻訳
rui314 / mold Public エラーが発生しました。ページを再読み込みしてください。通知サインインして通知設定を変更してください Fork 569 Star 17.4k mold 3.0.0 最新 最新比較タグを選択して比較申し訳ありません、問題が発生しました。ページを再読み込みしてください。結果が見つかりませんでしたすべてのタグを表示rui314 がリリースしました 05 Oct 10:23 · このリリース以降、main に 11 件のコミットがあります v3.0.0 8de38c3 mold 3.0.0 は、高速リンカのメジャーリリースです。2.42.1 リリースノートで発表したように、mold を C++ から Rust に書き直し、これが Rust 版の最初のリリースとなります。2.42.1 は C++ 版の最後のリリースです。mold 3.x の目標は、特にリンカスクリプトのサポートにおいて、GNU ld との残りの互換性ギャップを埋め、mold が Linux ディストリビューションでデフォルトのリンカとして採用される道を開くことです。mold 3.0 は 2.42.1 のドロップイン置換となることを意図しています。同じコマンドラインオプションを受け入れ、同じターゲットアーキテクチャをサポートし、以下のバグ修正を除いて同じ出力を生成します。リンクパフォーマンスは 2.42.1 と同等です。サポートされているすべてのターゲットでテストスイートを実行し、広範な実際のワークロードとオプションの組み合わせでリンカ出力を比較し、すべてのGentooパッケージをビルドして互換性を検証しました。回帰は見つかりませんでした。Rust への移行により、破損した入力ファイルに対する mold の安全性も向上しました。C++ 版では、そのような入力に対してメモリ外読み込みが発生し、セグメンテーション違反でクラッシュする可能性がありました。mold 3.0 では、これらの読み込みは境界チェックされるため、mold は誤ったアクセスでパニックを起こして停止します。mold を自分でビルドする場合、ビルドシステムが変更されたことに注意してください。「ビルドの変更」を参照してください。
ビルドの変更
Mold は CMake の代わりに Cargo でビルドされるようになりました。Rust 1.95 以降と C コンパイラが必要です。mold をビルドするには cargo build --release を実行し、インストールするには ./install-mold.sh を実行してください。インストールスクリプトは PREFIX と DESTDIR を受け付けます。CMake オプションは削除されました。mold のライブラリを $PREFIX/lib 以外のディレクトリ(例: /usr/lib64)にインストールする場合、mold -run が mold-wrapper.so を見つけられるように、ビルド時とインストール時の両方で MOLD_LIBDIR 環境変数をそのディレクトリに設定してください。mold はもはや oneTBB に依存しません。以前と同様に mimalloc 3.5.3 を静的にリンクします。システム malloc を使用するには --features system-allocator でビルドしてください。mold は利用可能な場合、システムの zlib をリンクし、zstd と BLAKE3 を含みます。システムの zstd をリンクするには ZSTD_SYS_USE_PKG_CONFIG=1 を設定してください。(56ee0f8) MOLD_TARGETS CMake 変数は Cargo フィーチャーに置き換えられました。以前と同様に、ディストリビューションはすべてのターゲットに対して mold をビルドすべきです。テストスイートは ctest の代わりに cargo test で実行されるようになりました。install-build-deps.sh は install-test-deps.sh に置き換えられました。これはテストを実行する場合にのみ実行する必要があります。
バグ修正と互換性向上
バージョン スクリプトまたは --default-symver を使用して静的リンク実行可能ファイルを作成する際のクラッシュを修正しました。(f10b0c4)
出力ファイルが入力ファイルでもある場合(例: mold -r -o foo.o foo.o bar.o)のクラッシュまたは出力破損を修正しました。(d2b88ab)
--gc-sections は、--init および --fini によって指定された関数を削除しなくなりました。(c9e4cc4)
同じ名前でサイズが異なる共通シンボルは、GNU ld および lld と同様に、最大のサイズと最も厳密なアライメントを持つようになります。(d5781d5)
--icf=safe は共有ライブラリからエクスポートされた関数を折りたたまなくなり、--icf=all は --emit-relocs でクラッシュしなくなりました。(ceab12c, 3dcd1df)
共有ライブラリ内の foo@VER のようなバージョン参照は、バージョン未指定の foo を定義するアーカイブメンバーをプルインしなくなりました。(#1657) (44bfa2a)
--dependency-file、--repro、多数の同じ名前のCOMDAT グループを持つ -r、および一部の動的リロケーションにおける、いくつかの非決定的な出力を修正しました。(5164561, 6d33903, 51e23d4, 696ed71)
いくつかの -r バグを修正しました。C++ 例外は 2 番目以降の入力ファイルからのコードで破損しました。-x、-X、-s はリロケーションが参照するシンボルを削除しました。--gc-sections はリロケーションが参照するデータをドロップしました。SHF_LINK_ORDER セクション(例: .ARM.exidx)の sh_link が設定されていませんでした。mold は --strip-debug および DWARF 型ユニットでクラッシュしました。(0e41bb9, 3717460, b2c3d1d, 9aacb62, a247ca2, e41ed90)
共有ライブラリで定義されたシンボルに対する GOT 相対リロケーション(例: R_X86_64_GOTOFF64、R_ARM_REL32)は、サイレントに誤ったアドレスを取得していました。これらは現在、正しく処理されるか、エラーとして報告されます。(#1668) (659780e, 7fe68bf)
位置独立出力で使用できない PC 相対リロケーションのエラーは、原因と修正方法を説明するようになりました。(39e6a01, 17b7b85)
以下の項目は、破損した出力またはクラッシュの代わりにエラーを引き起こすようになりました。共有ライブラリで定義されたシンボルをエイリアスする --defsym、共有ライブラリ内の未定義の非弱隠れシンボルまたは --unresolved-symbols=ignore-all、64 ビットに収まらない --defsym 値、圧縮されている割り当て済みセクション、および --strip-all と --emit-relocs の組み合わせ。(56b862b, b3566fa, e3a89f2, a980054, 8233a75)
--noinhibit-exec は、破棄されたCOMDAT グループ内のシンボルへの参照でクラッシュしなくなりました。(8f17166, 80baa5d)
単一ダッシュで始まるオプションは、GNU ld が読み取るように読み取られるようになりました。例えば、-entry=main は -e ntry=main として読み取られていました。(#1671, #1670) (830a860)
--dynamic-list-data、--lto-pseudo-probe-for-profiling、--thinlto-index-only は次の引数を消費しなくなり、--no-color-diagnostics が受け入れられるようになりました。(2ca893e, 04b493e)
バージョン スクリプトが 1 つ以上のバージョンノードにシンボルをリストする場合、GNU ld および lld と同様に、最初のものが優先されるようになりました。(b7048f5)
-C、--chroot、--repro との相対パスを修正しました。(e3bc349, 04e7dd8, a368d22)
Mold は起動時に 8 GiB の仮想アドレス空間を予約しなくなったため、ulimit -v の下でも動作します。(cc69390, b18be91)
XDG_RUNTIME_DIR が空文字列の場合でも MOLD_JOBS が機能するようになりました。(8a360ff)
--separate-debug-file によって作成されたファイルは、.gnu_debuglink セクションを含まなくなりました。(#1656) (b56649e)
Mold は、意味のない __start_EHDR、__stop_EHDR、__start_PHDR、__stop_PHDR シンボルを作成しなくなりました。(0ee71d3)
[AArch64][PPC32][ARM32] Chromium の ARM64 デバッグビルドのような大規模プログラムで、範囲拡張サンプ(range extension thunk)を介して他のセクションの静的関数への呼び出しが誤ったアドレスにジャンプしていた問題を修正しました。(4165d0e, 9b91621)
[AArch64] R_AARCH64_TSTBR14 や R_AARCH64_GOT_LD_PREL19 など、より多くのリロケーションタイプをサポートしました。(96d0282, a4b64d8)
[ARM32] R_ARM_ALU_PC_G0 や R_ARM_THM_PC12 など、より多くのリロケーションタイプをサポートし、ビッグエンディアン ARM の -r 出力を修正しました。(c0f9cd6, 4c9aad3, 4c26f16)
[ARM32][i386] -r は、一部の分岐および TLS リロケーションが参照する命令を破損しなくなりました。(1b17bdf)
[RISC-V][LoongArch] --icf=all によって折りたたまれた関数への呼び出しが、リラクゼーションによって縮小された場合、および 32 ビットオブジェクトでの R_RISCV_64 および R_LARCH_64 リロケーションを修正しました。(52febe9, 5b22233)
[RISC-V] Clang 18 によって作成されたオブジェクトファイルでの TLSDESC、TLSDESC リラクゼーションでの --emit-relocs、EF_RISCV_TSO フラグ、-r 出力での R_RISCV_ALIGN、および 32 ビット PC 相対リロケーションのオーバーフローチェックを修正しました。(fdf8422, 7c8b805, 6b60f75, 4ba7792, 85d55f3)
[LoongArch] 極端なコードモデルでの TLSDESC をサポートし、*64_PC_HI12 リロケーションの誤った値と TLS リロケーションの偽のオーバーフローエラーを修正しました。(a36a161, 8133938, 13e6cc0)
[PPC32][m68k] -fpic コードが使用する 16 ビットオフセットに対して大きすぎる GOT は、サイレントに切り捨てられるのではなく、エラーとして報告されるようになりました。(acc8854, 614e2a0)
[PPC64] 静的リンク実行可能ファイルでの IFUNC 呼び出しと手書きアセンブリでの @got 参照を修正し、mold は PPC64V1 用にも _savegpr0_* ファミリの関数を合成するようになりました。(d3b2a74, b34a308, efda2fc)
[SH4] PLT を介して構造体を返す関数を呼び出す際のクラッシュ、および -r 出力からリンクされたプログラムでの C++ 例外を修正しました。(d9cf1f0, 92161dd)
[SPARC64] R_SPARC_WDISP16 を使用する分岐命令、および -r 出力での R_SPARC_OLO10 を修正しました。(6df3fd2, 269fbb9)
謝辞
Mold はオープンソースプロジェクトであり、