SJ blog
backend
S

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Rust 1.96(5月28日)のWebAssembly破壊的変更——`--allow-undefined`廃止でwasm-bindgen/wasm-packユーザーは今すぐ対応を

Rust 1.96(2026年5月28日リリース予定)でWebAssemblyターゲットの--allow-undefinedフラグが廃止される。wasm-bindgenやwasm-packを使うプロジェクトで未定義シンボルがリンクエラーになる。現在のnaightlyで再現可能。修正方法を詳説。

一言結論

Rust 1.96(5月28日)でWebAssemblyターゲットの--allow-undefinedが廃止され、undefined symbolがリンクエラーになる。既存のwasm-bindgen/wasm-packプロジェクトが静かに壊れる可能性がある。修正は#[link]属性の追加か-Clink-arg=--allow-undefinedのフォールバックのみ。33日以内に対応が必要。

何が変わるのか

Rustの公式ブログが2026年4月4日に発表した内容が、開発者コミュニティで改めて注目を集めている。

Rust 1.96(2026年5月28日リリース予定) から、すべてのWebAssemblyターゲットにおいて wasm-ld--allow-undefined フラグが廃止される。

現在の動作(廃止前)

wasm-ld --allow-undefined
         ^^^^^^^^^^^^^^^
  未定義シンボル → エラーにせず、wasm importとして扱う
  (他のプラットフォームでは存在しない挙動)

変更後の動作(Rust 1.96〜)

wasm-ld  # --allow-undefined が渡されなくなる
  未定義シンボル → リンクエラー
  (他のネイティブプラットフォームと同じ厳格な挙動)

なぜこの変更が行われるのか

他のすべてのRustターゲット(Linux, macOS, Windows等)では、未定義シンボルはデフォルトでリンクエラーになる。WebAssemblyだけが --allow-undefined によって例外扱いされており、シンボル名のタイポや削除されたAPIへの参照がコンパイル時に検出されずに実行時エラーとして現れる問題があった。

// ❌ 現在はコンパイルが通ってしまうケース(タイポ)
extern "C" {
    fn my_host_funktion(); // "funktion" はタイポだが --allow-undefined で通過
}

この変更後は、このような問題がコンパイル時に検出されるようになる。

影響を受けるターゲット

wasm32-unknown-unknown   ← 最も広く使われる。影響大
wasm32-wasi              ← WASI対応プロジェクト
wasm32-wasip1            ← 同上
wasm32-wasip2            ← 同上

wasm-bindgenを使うプロジェクトへの影響

wasm-bindgen を使う場合、#[wasm_bindgen] マクロが自動的に正しい import モジュール名を付与する。最新版のwasm-bindgenに更新済みであれば基本的に問題ない。

# Cargo.toml
[dependencies]
wasm-bindgen = "0.2"   # 最新版を使用していれば対応済み

問題が起きやすいのは以下のケース:

// ❌ 問題になるパターン:wasm_import_module を指定していない extern ブロック
#[link(name = "my_lib")]
extern "C" {
    fn host_function(x: i32) -> i32;
}
// ✅ 修正後:wasm_import_module を明示する
#[link(wasm_import_module = "my_lib")]
extern "C" {
    fn host_function(x: i32) -> i32;
}

wasm_import_module を指定することで、シンボルは「undefined」ではなく「特定モジュールからのimport」として扱われ、リンクエラーにならない。

今すぐ確認する方法

Rust 1.96は nightly に既に入っている。今すぐ影響を確認できる:

# naightlyをインストール
rustup update nightly

# naightlyでビルドして影響を確認
cargo +nightly build --target wasm32-unknown-unknown

# エラーが出た場合の例
# error: linking with `wasm-ld` failed: exit status: 1
#   = note: rust-lld: error: undefined symbol: my_host_funktion

エラーが出たシンボルに対して #[link(wasm_import_module = "...")] を付与するか、以下のフォールバックを使う。

短期的なフォールバック(移行期間中)

# Cargo.toml — 期間限定の回避策
[target.wasm32-unknown-unknown]
rustflags = ["-Clink-arg=--allow-undefined"]

または .cargo/config.toml

[target.wasm32-unknown-unknown]
rustflags = ["-Clink-arg=--allow-undefined"]

このフォールバックは旧来の動作を復元するが、根本解決ではない。5月28日以降も動作させるための暫定措置として使い、適切な修正を並行して進めること。

プロジェクト別の対応方針

状況対応
wasm-bindgenのみ使用・最新版cargo +nightly build でエラーがなければ対応不要
手書きの extern "C" ブロックありwasm_import_module を明示
古いwasm-bindgen(0.2.80以前)wasm-bindgenを最新版にアップデート
wasm-packを使用wasm-pack build をnaightlyで試し、エラーがあれば上記対応
サードパーティクレートが影響を受けるクレートの最新版をチェック・issueを報告

タイムライン

2026-04-04  Rust公式ブログで変更をアナウンス
2026-04-25  本記事公開(nightly で既に影響確認可能)
2026-05-28  Rust 1.96 正式リリース → --allow-undefined 廃止
            ↑ 残り33日

stable版Rustを追っているプロジェクトでも、5月28日にRust 1.96がリリースされると同時に cargo update + rustup update でこの変更の影響を受ける。

まとめ

--allow-undefined の廃止はRustがすべてのプラットフォームで一貫した挙動を持つための正しい変更だが、既存のWebAssemblyプロジェクトに静かな破壊的変更をもたらす。

今日やること:

  1. cargo +nightly build --target wasm32-unknown-unknown を実行してエラー確認
  2. エラーがあれば #[link(wasm_import_module = "...")] を付与
  3. エラーがなければ5月28日以降も問題ない

参考リンク