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

共有ライブラリを作るとき、外から使う関数だけを公開し、内部の関数はシンボルの可視性(visibility)を「hidden」にする利点として正しいものはどれか。

  1. A内部の関数が暗号化され、解析できなくなる
  2. B動的リンカが扱うシンボルが減って読み込みが速くなり、内部の呼び出しもPLTを通さずに済む
  3. CライブラリをどのOSでも動かせるようになる
答えと解説を見る

正解:B. 動的リンカが扱うシンボルが減って読み込みが速くなり、内部の呼び出しもPLTを通さずに済む

共有ライブラリの公開されたシンボルは、ほかのモジュールの同じ名前の定義に差し替えられる可能性があるので、内部からの呼び出しもPLTやGOTを通す必要があります。hiddenにすると外から見えなくなり、動的リンカが調べるシンボルの数が減り、内部の呼び出しはPC相対で直接行えます。ほかのライブラリとの名前の衝突も避けられ、公開するABIも小さく保てます。

  • A. 暗号化はされません。
  • B. 正しい。名前の衝突も防げます。
  • C. OSの違いを吸収するものではありません。
この分野を解く 分野ページへ

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

  1. C++でグローバルなオブジェクトのコンストラクタがmainより前に実行されるしくみとして正しいものはどれか。
  2. コンパイラが1つのソースファイルから出力するオブジェクトファイル(.o)について正しいものはどれか。
  3. リンカの主な役割として正しいものはどれか。
  4. リンカが行うシンボル解決の説明として正しいものはどれか。
  5. リンカが行う再配置(リロケーション)の説明として正しいものはどれか。