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

動的リンクで、PLT(プロシージャリンケージテーブル)を使った遅延束縛(レイジーバインディング)を行う場合の説明として正しいものはどれか。

  1. A共有ライブラリの関数の番地は、その関数が初めて呼ばれたときに解決され、2回目からは解決済みの番地へ直接飛ぶ
  2. Bプログラムの起動前に、すべての関数の番地を必ず解決しておく
  3. C関数を呼ぶたびに、ライブラリのファイルをディスクから読み直す
答えと解説を見る

正解:A. 共有ライブラリの関数の番地は、その関数が初めて呼ばれたときに解決され、2回目からは解決済みの番地へ直接飛ぶ

プログラムは外部の関数をPLTの小さな入口を通して呼びます。遅延束縛では、最初の呼び出しのとき入口が動的リンカの解決処理へ飛び、本物の番地を探してGOTに書き込みます。2回目からはGOTの番地へそのまま飛びます。使われない関数の解決を省けるので起動が速くなります。ただし安全のため、起動時にすべて解決してGOTを読み取り専用にする設定も広く使われています。

  • A. 正しい。使わない関数の解決を省けます。
  • B. それは起動時にすべて解決する方式(即時束縛)です。
  • C. ディスクから読み直すことはありません。
この分野を解く 分野ページへ

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

  1. Linuxで動的リンクのプログラムを起動するときに働く動的リンカ(ld.soなど)の役割として正しいものはどれか。
  2. ASLR(アドレス空間配置のランダム化)の目的として正しいものはどれか。
  3. 実行ファイルをPIE(位置独立実行ファイル)として作る主な理由はどれか。
  4. プログラムを起動するとき(Linuxのexecveなど)に、OSのローダが行うこととして正しいものはどれか。
  5. C言語のプログラムで、OSが最初に実行を始める番地(エントリポイント)について正しいものはどれか。