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

共有ライブラリで使われるGOT(グローバルオフセットテーブル)の役割として正しいものはどれか。

  1. Aライブラリの関数の名前を、アルファベット順に並べた目次である
  2. Bキャッシュに入りきらなかったデータを一時的に置く表である
  3. C外部の変数や関数の実際の番地をまとめた表で、実行時に動的リンカが埋め、コードはこの表を通して参照する
答えと解説を見る

正解:C. 外部の変数や関数の実際の番地をまとめた表で、実行時に動的リンカが埋め、コードはこの表を通して参照する

位置独立コードは、ほかのライブラリにある変数の番地を命令に直接書けません。そこで、各モジュールに番地を並べた表(GOT)を用意し、コードはPCからの距離でGOTの項目を読み、そこに入っている番地を使います。動的リンカは読み込んだときにGOTに実際の番地を書き込みます。書き換えるのは書き込み可能なデータのGOTだけなので、コードのページは共有したままにできます。

  • A. 目次ではなく、番地の表です。
  • B. キャッシュとは関係ありません。
  • C. 正しい。書き換えるのはデータの表だけで、コードは書き換えません。
この分野を解く 分野ページへ

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

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