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

コンパイラが1つのソースファイルから出力するオブジェクトファイル(.o)について正しいものはどれか。

  1. AそのままOSで実行できる完成したプログラムである
  2. Bソースコードを圧縮しただけのもので、機械語は含まない
  3. C機械語を含むが、ほかのファイルにある関数や変数の番地はまだ決まっていない
答えと解説を見る

正解:C. 機械語を含むが、ほかのファイルにある関数や変数の番地はまだ決まっていない

オブジェクトファイルには、そのファイルの関数を翻訳した機械語、変数の初期値、定義や参照している名前の一覧(シンボルテーブル)、後から番地を埋める場所の一覧(再配置情報)が入っています。printfのようにほかのファイルにある関数を呼ぶ命令は、番地が分からないので仮の値のままです。リンカが複数のオブジェクトファイルをまとめて番地を決め、実行ファイルを作ります。

  • A. 実行するにはリンクが必要です。
  • B. 中身は機械語とその付属情報です。
  • C. 正しい。番地はリンクのときに決まります。
この分野を解く 分野ページへ

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

  1. リンカの主な役割として正しいものはどれか。
  2. リンカが行うシンボル解決の説明として正しいものはどれか。
  3. リンカが行う再配置(リロケーション)の説明として正しいものはどれか。
  4. C言語のプログラムをリンクしたときに「undefined reference to `foo'」(fooへの未定義の参照)というエラーが出た。最も考えられる原因はどれか。
  5. a.cとb.cの両方で、static を付けない同じ名前のグローバル関数 void init(void) を定義してリンクした。起こることとして正しいものはどれか。