C プログラムが実行可能ファイルにコンパイルされるとき、これはシステムに依存する方法で行われます。Ubuntu ではELF形式が使用され、Windows ではPEがあります。
プロセスを開始すると、ELF または PE が読み取られ、メモリの割り当て方法とプロセスのさまざまな部分を仮想メモリ テーブルのどこに配置するかについての指示/マップが提供されます。さらに、同じライブラリを使用している他のプロセスと共有する、すでに物理メモリにある動的にロードされたライブラリにリンクします。または、動的ライブラリが存在しない場合は、それらをロードします。(Linux .so、Windows .dll)。静的ライブラリがある場合、これらは割り当てられ、リンクされます (Linux .a、Windows .lib)。- 非常に単純化されています。
メモリ制限などは前のプロセスから継承されます。
環境変数は、プロセスの実行環境に配置されます。これはパス、引数などです。その後main()
、スタックに追加されて呼び出されます。
現在、メインが呼び出される前に発生するすべてのこと、リンケージなどがどのように解決されるか、およびその他多くのことがシステムに依存します。これが、Windows 上の Linux でコンパイルされた実行可能ファイルを単純に実行できない理由です。
1つを使用cygwin
すると、それらのリンクなどが同じで機能する仮想環境を作成するだけです。1 つは ELF 環境を作成します。
ネイティブ Windows コマンド ラインにリンクするには、Windows 用にコンパイルする必要があります。その点については、すでに多くの答えがあることがわかります。
ELF と PE は、異なるシステムと同様に、環境変数などを処理する方法も異なります。これらは何であるかなどです。つまり、ファイル展開は異なる方法で処理されます。ただし、実行中の両方のプロセスには、stderr
、stdout
およびのようなデフォルトのストリームがありますstdin
。しかし、C のコードの下では、それらは同じではありません。
ディーゼル車とガソリン車を運転するようなものです。多くは同じですが、ボンネットの下ではかなりの数が異なります。
つまり、Windows ではシグナルの処理が異なることに注意してください。