Files
hakorune/docs/development/design/legacy/linker-box.md

49 lines
2.9 KiB
Markdown
Raw Normal View History

LinkerBox 仕様Phase 15 準備 / Windows優先
目的
- AOT 生成されたオブジェクト(`.o/.obj`)を NyRT とリンクして実行可能ファイルを得る統一レイヤ。
- 初期実装は「外部リンカー呼び出し」MSVC `link.exe` または `lld-link`、Unix は `cc`)で動作し、将来的に lld 内蔵連携へ置換可能な設計とする。
前提/エントリポイント
- 既定のエントリポイントは NyRT 側の `main()``crates/nyrt` に実装)。
- AOT 側は `ny_main`(想定: `() -> i64`を定義し、NyRT の `main()``ny_main()` を呼び出す。
- よって通常は `/ENTRY:` 指定は不要NyRT をリンクしない特殊構成でのみ上書き可能とする)。
入力と出力
- 入力: 一つ以上のオブジェクト(`.obj`/`.o`)、追加ライブラリ群、ライブラリ検索パス。
- 既定ライブラリ: NyRTWindows: `nyrt.lib`、Unix: `libnyrt.a`)。
- 出力: 実行ファイルWindows: `*.exe`、Unix: 実行ビット付きバイナリ)。
環境変数LinkerBox が解釈)
- `NYASH_LINKER`: 使用リンカーを強制。`link` | `lld-link` | `cc`(未指定は OS/環境から自動推定)
- `NYASH_LINK_FLAGS`: 追加フラグ(空白区切り)。
- `NYASH_LINK_VERBOSE=1`: 実コマンドラインを表示。
- `NYASH_LINK_ENTRY=<symbol>`: エントリポイントを明示的に指定(既定は未指定で NyRT の `main` を使用)。
- `NYASH_LINK_OUT=<path>`: 出力先を明示的に指定CLI引数 `-o` が優先)。
WindowsMSVC / lld-link
- 既定探索順: `link.exe``lld-link`
- 代表フラグ:
- `link.exe`: `/OUT:<exe>` `/SUBSYSTEM:CONSOLE`(既定) `/LIBPATH:<dir>` `nyrt.lib`
- `lld-link`: `-OUT:<exe>` `-SUBSYSTEM:CONSOLE` `-LIBPATH:<dir>` `nyrt.lib`
- `PATH`/`LIB`/`LIBPATH` の整合に注意Developer Command Prompt を推奨)。
Unix参考
- 代表フラグ: `cc -o <exe> <objs...> <lib paths> -L... -lnyrt -ldl -lpthread`
- 既定のオブジェクト形式/ターゲットはホストに従う。
CLI API想定
- `nyash --linker link|lld-link|cc --libpath <dir> --lib nyrt [--entry nyash_main] -o app <objs...>`
- AOT パスでは内部的に LinkerBox を呼び出し、上記環境変数も透過的に反映する。
エラー方針
- ツールチェーン未検出(リンカー不在): わかりやすい対処案を表示MSVC のセットアップlld の導入)。
- 未解決シンボル: `ny_main`/NyRT 関連の欠落を優先表示。
- 引数/パスのクォート: 空白を含むパスは安全にクォートして実行。
将来拡張
- 内蔵 lld を採用した一体化(外部プロセス呼び出しからの置換)。
- ターゲットトリプルの明示指定とクロスリンク(フェーズ後半)。
- 追加ランタイムやプラグイン静的リンクのオプション化。