1

Visual Studio2010でC++コンパイラ(Win32がターゲット)を使用して単純なHello Worldアプリケーションをコンパイルし、Immunityデバッガーで実行したときに顕微鏡で製品がどのように表示されるかを確認しました。ただし、私が気付いたのは、メイン関数に到達する前に実行されるコード(実際にはかなりのコード)があることです。このようなものの多くは、セキュリティに関連しているように見えたり、プロセスを管理するためにシステムを準備しているように見えますが、そこにはほんの1トンしかありません。さらに、PEファイルヘッダーのEntryPoint部分は、私の.textセグメントの内部を指しているように見えますが、私のmain()関数は.textセグメントの最初にあるように見えます。私の質問はこれです:私のコードの前に叩きつけられているこのプレリュードに関するいくつかの良いドキュメントがありますか、および/またはVC ++コンパイラによって.textセグメントの最初に通常配置されるmain()関数ですか?あなたが持っている洞察に感謝します!

4

2 に答える 2

1

コンパイラーは、ユーザーコードをセグメントの先頭に配置します。これは.textコードが見つかると予想される場所だからです。他のすべての非ユーザーコードは、プログラムが期待どおりに機能するために必要なコードの後に​​配置されますが、心配する必要はありません。Cプログラムを作成するときは、ローカル配列のコマンドライン引数、グローバル変数の初期化、標準I / Oが使用可能であることの確認、Cランタイムに必要なその他の重要なことなど、特定の機能が利用可能であることを期待します。初期化されました。

ルーチンのソースコードを見ると、コメントはそれが必要な理由を説明しています。

これらのルーチンは、Cランタイムの初期化を実行し、適切なユーザー入力関数を呼び出し、終了のクリーンアップを処理します。マネージドアプリの場合、終了コードを呼び出し元のルーチンに戻します。これはマネージドスタートアップコードです。管理されていないアプリの場合、exitを呼び出し、戻ることはありません。

于 2010-10-06T23:51:17.600 に答える
1

2010年についてはわかりませんが、古いVC6には、この初期化コードを含むファイル(crtexe.cと呼ばれていました)を含む、CRTのソースコードが付属していました。

コマンドラインアプリのデフォルトのエントリポイントは、mainCRTStartupと呼ばれます。

于 2010-10-06T21:43:41.397 に答える