信頼度ランク
| 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プロジェクトに静かな破壊的変更をもたらす。
今日やること:
cargo +nightly build --target wasm32-unknown-unknownを実行してエラー確認- エラーがあれば
#[link(wasm_import_module = "...")]を付与 - エラーがなければ5月28日以降も問題ない