1. ホーム
  2. c

[解決済み] C言語での_start()の使い方は?

2022-05-11 06:51:05

質問

を書かなくてもCプログラムを書いて実行できることを同僚から聞きました。 main() 関数を書かずにCプログラムを書いて実行できることを同僚から教えてもらいました。それは次のようにできます。

my_main.c

/* Compile this with gcc -nostartfiles */

#include <stdlib.h>

void _start() {
  int ret = my_main();
  exit(ret); 
}

int my_main() {
  puts("This is a program without a main() function!");
  return 0; 
}

このコマンドでコンパイルします。

gcc -o my_main my_main.c –nostartfiles

このコマンドで実行します。

./my_main

このようなことはいつ必要なのでしょうか?これが役に立つ実世界のシナリオはあるのでしょうか?

どのように解決するのですか?

シンボル _start エントリポイント である。つまり、そのシンボルのアドレスは、プログラム起動時にジャンプするアドレスです。通常、関数名 _start というファイルから提供されます。 crt0.o と呼ばれるファイルから供給されます。このファイルには C ランタイム環境のためのスタートアップ・コードが含まれています。これはいくつかのものをセットアップし、引数配列である argv に入力し、そこにある引数の数を数えて、それから main . その後 main が返されます。 exit が呼び出されます。

もしプログラムが C ランタイム環境を使いたくない場合は、独自のコードで _start . 例えば、プログラミング言語 Go の参照実装は、スタックにいくつかのマジックを必要とする非標準のスレッドモデルを必要とするため、そうしています。また、独自の _start また、本当に小さなプログラムや型破りなことをするプログラムを書きたいときに、独自の を提供するのも便利です。