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

C言語のプログラムをリンクしたときに「undefined reference to `foo'」(fooへの未定義の参照)というエラーが出た。最も考えられる原因はどれか。

  1. Afooの中に文法の誤りがある
  2. Bfooを2つのファイルで定義している
  3. Cfooを呼んでいるが、fooの中身を定義したファイルやライブラリがリンクに含まれていない
答えと解説を見る

正解:C. fooを呼んでいるが、fooの中身を定義したファイルやライブラリがリンクに含まれていない

ヘッダファイルで関数を宣言していれば、コンパイルは通ります。しかしリンクのときに、fooを定義したオブジェクトファイルやライブラリが見つからないと、呼び出し命令に入れる番地が決まらず、このエラーになります。定義したファイルをリンクし忘れた、ライブラリを指定し忘れた(-lm など)、名前のつづりや引数の違いで別の名前になっている、といった原因がよくあります。

  • A. 文法の誤りならコンパイルの段階で止まります。
  • B. 2つあれば多重定義のエラーになります。
  • C. 正しい。宣言はあっても定義が見つからない状態です。
この分野を解く 分野ページへ

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

  1. a.cとb.cの両方で、static を付けない同じ名前のグローバル関数 void init(void) を定義してリンクした。起こることとして正しいものはどれか。
  2. C言語で関数にstaticを付けて定義したとき(例: static int helper(void))の効果として正しいものはどれか。
  3. C言語で「extern int count;」と書いたときの意味として正しいものはどれか。
  4. Linuxなどでよく使われるELF形式のファイルについて正しいものはどれか。
  5. 実行ファイルの.textセクションに入っているものはどれか。