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

C言語のプログラムで、OSが最初に実行を始める番地(エントリポイント)について正しいものはどれか。

  1. A必ずmain関数の先頭である
  2. B実行ファイルの先頭のバイトと決まっている
  3. C通常はmainではなく_startなどの起動用のコードで、初期化をしてからmainを呼ぶ
答えと解説を見る

正解:C. 通常はmainではなく_startなどの起動用のコードで、初期化をしてからmainを呼ぶ

リンカは、Cのランタイムが用意する起動用のオブジェクト(crt1.oなど)をプログラムに組み込み、その中の_startを入口にします。_startは、スタックからコマンドライン引数を取り出し、標準ライブラリやグローバルなオブジェクトの初期化を行ってからmainを呼びます。mainが戻ると、その戻り値を使ってexitを呼び、終了の処理をします。

  • A. mainの前に準備の処理が動きます。
  • B. 入口の番地はELFヘッダに記録されます。
  • C. 正しい。Cのランタイムが用意する起動コードです。
この分野を解く 分野ページへ

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

  1. C言語のmain関数が「return 3;」で終わったとき、その値3は一般にどうなるか。
  2. 実行ファイルにstripコマンドを使ったときに起こることとして正しいものはどれか。
  3. リンカでの弱いシンボル(weak symbol)の扱いとして正しいものはどれか。
  4. C++のコンパイラが関数名に引数の型などの情報を付け加えてシンボル名を作る「名前修飾(マングリング)」の主な目的はどれか。
  5. Linuxのdlopen関数(WindowsのLoadLibraryに相当)の使い道として最も適切なものはどれか。