- ベストアンサー
リンカへのファイルの指定順序
リンカにオブジェクトファイル/アーカイブを指定する時に依存"される"ファイルを依存"する"ファイルより後にしなければいけないのはなぜですか? 具体的にfoo.a内のシンボルをbar.oで参照している時 ld foo.a bar.o -o abc とするとUndefined reference *** とエラーが出ます。 また、オブジェクトファイル同士の場合はコマンドラインでのファイル順序が関係ないのはなぜですか? 例えば先ほどのfoo.aには、foo.oが含まれており、 ld foo.o bar.o -o abc ではエラーは発生しません。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
1PASSでしかシンボルを探さない方式か2PASSでシンボルを探す方式かの違いです。1PASSでしか探さない方式では必ずシンボルの定義が必ず先に存在しなければなりません。先にないとUndefined エラーになります。アセンブラ、リンカーなどの設計の方式の違いです。1PASSアセンブラ、2PASSアセンブラなどと呼ばれます。リンカーも同じです。アセンブラの場合は2PASSでないと使いにくいので普通は2PASSになってます。リンカー/ローダーは先にオブジェクト中のUndefinedシンボルをテーブルに登録しながらロードし、後からライブラリーを検索して解決します。ライブラリーに相当するファイルは先に指定されても困るわけです。(ライブラリーに相当するファイルはオブジェクトファイルと違って全体をロードする訳ではないですから)。
お礼
ご教授有難う御座いました。 ldは、1PASSでしかシンボルを探さない方式のようですね。 kngj1740様の回答をきっかけに自分でも少し調べてみました。 http://stackoverflow.com/questions/11893996/why-does-the-order-of-l-option-in-gcc-matter