Files
hakorune/docs/interfaces/linker-box.md

2.9 KiB
Raw Blame 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.exelld-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 を採用した一体化(外部プロセス呼び出しからの置換)。
  • ターゲットトリプルの明示指定とクロスリンク(フェーズ後半)。
  • 追加ランタイムやプラグイン静的リンクのオプション化。