このエコシステム全体がどのように機能するかを理解するために、LLVM で小さなコンパイラを構築しようとしています。オブジェクトファイルの生成まではできました。さて、リンク部分について少し混乱しています。私の理解では、clang はシステムに存在するデフォルトのリンカーを見つけ (特に指定されていない限り)、 or 呼び出しを使用してリンクを行いsystem
ますfork_exec
。これは、ユーザーがコマンド ラインから手動でリンカーを実行する場合とほとんど同じです。
しかし、llvm ツールチェーン内にlldというプロジェクトがあることも知っています。これは別のリンカですが、より高速で、さまざまな種類のオブジェクト ファイル (COFF、ELF など) をリンクできます。それで、なぜclangがlld自体を使用しないのか考えています。つまり、オブジェクト ファイルやその他のフラグを引数として関数を呼び出し、最終的なバイナリを戻り値の型 (または参照パラメーター) として取得するソース コード内のライブラリとして使用しないでください。システムリンカーに依存せずに(おそらくフォールバックとして)独自のバージョンのlldを出荷できます。コードの再利用以外に、これがプログラムで行われない理由はありますか?
いくつかの質問:
- システム内のすべてのリンカーはクロスリンクをサポートしていますか (つまり、Windows でリンカーを使用して Linux バイナリを生成できますか)?
- 通常同梱されているものをハードコーディングする以外に、プログラム内のシステム リンカを見つけるコマンドまたはその他の方法はありますか?
システムと言うときは、オペレーティング システムを意味します。