リンカ・ローダと実行形式
動的リンクで、PLT(プロシージャリンケージテーブル)を使った遅延束縛(レイジーバインディング)を行う場合の説明として正しいものはどれか。
- A共有ライブラリの関数の番地は、その関数が初めて呼ばれたときに解決され、2回目からは解決済みの番地へ直接飛ぶ
- Bプログラムの起動前に、すべての関数の番地を必ず解決しておく
- C関数を呼ぶたびに、ライブラリのファイルをディスクから読み直す
答えと解説を見る
正解:A. 共有ライブラリの関数の番地は、その関数が初めて呼ばれたときに解決され、2回目からは解決済みの番地へ直接飛ぶ
プログラムは外部の関数をPLTの小さな入口を通して呼びます。遅延束縛では、最初の呼び出しのとき入口が動的リンカの解決処理へ飛び、本物の番地を探してGOTに書き込みます。2回目からはGOTの番地へそのまま飛びます。使われない関数の解決を省けるので起動が速くなります。ただし安全のため、起動時にすべて解決してGOTを読み取り専用にする設定も広く使われています。
- A. 正しい。使わない関数の解決を省けます。
- B. それは起動時にすべて解決する方式(即時束縛)です。
- C. ディスクから読み直すことはありません。