main()は他の関数と同様の関数ですが、バイナリ内のエントリ ポイント、つまりオペレーティング システムが見つけて (方法がわからない) そこからプログラムを開始するエントリ ポイントとして「マーク」されていると彼らは言います。というわけで、この機能について詳しく調べてみました。私が何をした?このコードを内部に含む単純な .C ファイルを作成しました。
int main(int argc, char **argv) {
return (0);
}
ファイルを保存し、GCC コンパイラ (Windows、MingW 環境) をインストールして、次のようなバッチ ファイルを作成しました。
gcc -c test.c -nostartfiles -nodefaultlibs -nostdlib -nostdinc -o test.o
gcc -o test.exe -nostartfiles -nodefaultlibs -nostdlib -nostdinc -s -O2 test.o
@%comspec%
私がこれを行ったのは、非常に単純化されたコンパイラーとリンカー、ライブラリーもヘッダーもなく、コンパイラーだけを入手するためでした。したがって、コンパイルはうまくいきますが、リンクは次のエラーで停止します。
test.c:(.text+0xa): undefined reference to '___main'
collect2.exe: error: Id returned 1 exit status
メイン関数はリンカーによってエクスポートされると思いましたが、それに関する追加情報を含むライブラリは必要ないと思いました。しかし、それはそうであるように見えます。私の場合、これは標準の GCC ライブラリーでなければならないと思ったので、そのソース コードをダウンロードして、次のファイルを開きました 。 GCC によってリンクされています。実際、メイン関数が GCC でどのように使用されているかわかりません。リンカが gcc 標準ライブラリを必要とするのはなぜですか? メインについて知るには?これにより、私の質問が非常に具体的かつ明確になったことを願っています。ありがとう!