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

a.cとb.cの両方で、static を付けない同じ名前のグローバル関数 void init(void) を定義してリンクした。起こることとして正しいものはどれか。

  1. A後からリンクした方が自動で使われ、エラーは出ない
  2. B同じシンボルが2回定義されているとして、リンクのときにエラーになる
  3. C2つの関数が自動で1つにまとめられ、両方の処理が順に実行される
答えと解説を見る

正解:B. 同じシンボルが2回定義されているとして、リンクのときにエラーになる

staticを付けないグローバル関数は、プログラム全体で1つの名前を共有します。同じ名前の定義が2つあると、リンカは参照をどちらに結びつければよいか決められないので、多重定義(multiple definition)のエラーになります。ファイルの中だけで使う関数ならstaticを付けて外から見えなくすれば、別のファイルに同じ名前があっても衝突しません。

  • A. 通常の(強い)シンボルではどちらかを選ぶことはしません。
  • B. 正しい。多重定義のエラーです。
  • C. 関数がまとめられることはありません。
この分野を解く 分野ページへ

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

  1. C言語で関数にstaticを付けて定義したとき(例: static int helper(void))の効果として正しいものはどれか。
  2. C言語で「extern int count;」と書いたときの意味として正しいものはどれか。
  3. Linuxなどでよく使われるELF形式のファイルについて正しいものはどれか。
  4. 実行ファイルの.textセクションに入っているものはどれか。
  5. C言語でファイルの外側に「int limit = 100;」と書いたグローバル変数は、一般にどのセクションに置かれるか。