• ベストアンサー

リンカへのファイルの指定順序

リンカにオブジェクトファイル/アーカイブを指定する時に依存"される"ファイルを依存"する"ファイルより後にしなければいけないのはなぜですか? 具体的にfoo.a内のシンボルをbar.oで参照している時 ld foo.a bar.o -o abc とするとUndefined reference *** とエラーが出ます。 また、オブジェクトファイル同士の場合はコマンドラインでのファイル順序が関係ないのはなぜですか? 例えば先ほどのfoo.aには、foo.oが含まれており、 ld foo.o bar.o -o abc ではエラーは発生しません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.1

1PASSでしかシンボルを探さない方式か2PASSでシンボルを探す方式かの違いです。1PASSでしか探さない方式では必ずシンボルの定義が必ず先に存在しなければなりません。先にないとUndefined エラーになります。アセンブラ、リンカーなどの設計の方式の違いです。1PASSアセンブラ、2PASSアセンブラなどと呼ばれます。リンカーも同じです。アセンブラの場合は2PASSでないと使いにくいので普通は2PASSになってます。リンカー/ローダーは先にオブジェクト中のUndefinedシンボルをテーブルに登録しながらロードし、後からライブラリーを検索して解決します。ライブラリーに相当するファイルは先に指定されても困るわけです。(ライブラリーに相当するファイルはオブジェクトファイルと違って全体をロードする訳ではないですから)。

Falcon2
質問者

お礼

ご教授有難う御座いました。 ldは、1PASSでしかシンボルを探さない方式のようですね。 kngj1740様の回答をきっかけに自分でも少し調べてみました。 http://stackoverflow.com/questions/11893996/why-does-the-order-of-l-option-in-gcc-matter

関連するQ&A