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

C++でグローバルなオブジェクトのコンストラクタがmainより前に実行されるしくみとして正しいものはどれか。

  1. ACPUがコンストラクタを見つけて、自動で先に実行する
  2. Bmain関数の最初の行に、コンパイラが必ずすべてのコンストラクタを書き写す
  3. Cコンストラクタを呼ぶ関数の番地が.init_arrayなどの表にまとめられ、起動コードがmainの前に順に呼ぶ
答えと解説を見る

正解:C. コンストラクタを呼ぶ関数の番地が.init_arrayなどの表にまとめられ、起動コードがmainの前に順に呼ぶ

コンパイラは、各ファイルのグローバルなオブジェクトを初期化する関数を作り、その番地を.init_arrayという特別なセクションに入れます。リンカはすべてのファイルの.init_arrayを1つの表にまとめ、起動コードや動的リンカがmainの前にこの表の関数を順に呼びます。逆に終了時の処理は.fini_arrayにまとめられます。ファイルをまたぐ初期化の順番は決まっていないので、依存させないよう注意が必要です。

  • A. CPUはコンストラクタという概念を知りません。
  • B. ほかのファイルのオブジェクトは、mainのファイルからは分かりません。
  • C. 正しい。リンカが各ファイルの表を1つにまとめます。
この分野を解く 分野ページへ

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

  1. コンパイラが1つのソースファイルから出力するオブジェクトファイル(.o)について正しいものはどれか。
  2. リンカの主な役割として正しいものはどれか。
  3. リンカが行うシンボル解決の説明として正しいものはどれか。
  4. リンカが行う再配置(リロケーション)の説明として正しいものはどれか。
  5. C言語のプログラムをリンクしたときに「undefined reference to `foo'」(fooへの未定義の参照)というエラーが出た。最も考えられる原因はどれか。