リンカ・ローダと実行形式

GNUのリンカで「gcc -lmylib main.o」のように、静的ライブラリをそれを使うオブジェクトファイルより前に書くと、未定義の参照のエラーになることがある。その理由として正しいものはどれか。

  1. Aリンカは左から順に処理し、ライブラリを読む時点でまだ参照されていない関数は取り出さないから
  2. Bライブラリは必ずコマンドの最後に1つしか書けない決まりだから
  3. Cライブラリを前に書くと、ライブラリの中身が消去されるから
答えと解説を見る

正解:A. リンカは左から順に処理し、ライブラリを読む時点でまだ参照されていない関数は取り出さないから

GNUのリンカは、コマンドラインに書かれた順にファイルを処理し、静的ライブラリに出会った時点で「まだ定義が見つかっていない参照」を解決するオブジェクトだけを取り出します。ライブラリを先に書くと、その時点ではmain.oの参照がまだないので何も取り出されず、後からmain.oを読んでも戻って探しません。そのため、ライブラリは使う側の後ろに書くのが原則です。

  • A. 正しい。順番に意味があります。
  • B. ライブラリは複数書けます。
  • C. ライブラリの中身が消えることはありません。
この分野を解く 分野ページへ

リンカ・ローダと実行形式のほかの問題

  1. 位置独立コード(PIC)の説明として正しいものはどれか。
  2. 共有ライブラリで使われるGOT(グローバルオフセットテーブル)の役割として正しいものはどれか。
  3. 動的リンクで、PLT(プロシージャリンケージテーブル)を使った遅延束縛(レイジーバインディング)を行う場合の説明として正しいものはどれか。
  4. Linuxで動的リンクのプログラムを起動するときに働く動的リンカ(ld.soなど)の役割として正しいものはどれか。
  5. ASLR(アドレス空間配置のランダム化)の目的として正しいものはどれか。