0

Hullo、cコンパイラによってコンパイルされたwin32 exeプログラムを分解すると、一部のコンパイラがその中のいくつかの「隠された」ルーチンをリンクしていることがわかります-cプログラムが空で、5バイト程度であっても。

そのような5バイトがPE.exe形式でエンベロープされていることは理解していますが、なぜいくつかのルーチンを配置するのですか?それは私にとって必要ではないようで、多少面倒ですらあります。それは何ですか?省略できますか?私が理解しているように、cプログラム(現在、いくつかの初期ルーチンがあることがわかっているC ++については話さない)は、そのような補完的な隠し関数を必要としないはずです。

答えのための多くのtnx、おそらくいくつかの拡張情報リンクでさえ、このトピックが私に非常に興味を持っている原因になります

//編集

わかりました、それは当時私が行ったいくつかの厄介なことです(デジタル火星と古いボーランドコマンドライン(私もテストしました)は両方ともはるかに多くのコードを作成します(そしてImは特にbcc32に興味があります)が、そのような分解には読み取り可能な名前/記号が含まれていませんだからここには投稿しません

これらはやや読みやすいですが、私はそれが何であるかを理解した経験がありません;-)

https://dl.dropbox.com/u/42887985/prog_devcpp.htm

https://dl.dropbox.com/u/42887985/prog_lcc.htm

https://dl.dropbox.com/u/42887985/prog_mingw.htm

https://dl.dropbox.com/u/42887985/prog_pelles.htm

いくつかの説明的なコメントは何ですか?(ここにいくつかのc ++ sh * tがあるのではないかと思いますが、c ++ではなく純粋なcアドオンに興味がありますが、cモードでコンパイルされたことを確認するには疲れすぎて、コンパイルされた空のメインプログラムの拡張はcでした。 c++ではなくcで出力されると思っていました)

それが何であるかについてのより長い説明のためのtnx

4

3 に答える 3

2

win32 exeファイルは動的にリンクされたオブジェクトファイルであるため、リンク先のライブラリの名前や解決が必要なシンボルなど、ダイナミックリンカがそのジョブを実行するために必要なデータが含まれます。

空のプログラムでさえ、main()c-runtimeおよびkernel32.dllライブラリ(そしておそらく他のライブラリ?-私が最後にWin32 devを実行してからしばらく経ちます)にリンクします。

main()また、これはプログラムのエントリポイントにすぎないことにも注意してください。stderrコマンドラインの取得とトークン化、ロケールの設定、、の作成、その他のメカニズムの設定stdinなど、このポイントの前にすでにかなりのことが行われています。stdoutこのようなc-runtimeライブラリで必要ですat_exit()。同様に、main()戻ってきたときに、ランタイムはクリーンアップを実行します。少なくとも、カーネルを呼び出して、完了したことを通知する必要があります。

それが必要かどうかについては?はい、毎回独自のプログラムプロローグとエピローグを書くのが好きでない限り。あなたが十分にマゾヒスティックであるならば、おそらく最小限の静的にリンクされたアプリケーションを書く方法があります。

ストレージのオーバーヘッドに関しては、なぜそんなに手間がかかるのですか?心配するだけでは十分ではありません。

于 2012-08-16T19:45:58.637 に答える
1

Windowsでプログラムを実行するたびにロードされる初期化関数がいくつかあります。これらの関数は、特に、作成したmain()関数を呼び出します。そのため、プログラムを実行するには、main()関数またはWinMain()関数のいずれかが必要です。私は他の含まれている機能を知りませんが。見せるための分解はありますか?

于 2012-08-16T19:38:36.960 に答える
1

先に進む詳細はあまりありませんが、表示されているもののほとんどは、コンパイラが動作する特定のCランタイムライブラリのルーチンである可能性が高いと思います。

たとえば、ポータブル実行可能形式がCプログラムで記述したmain(char ** args)を呼び出すことを理解しているエントリポイント「main」から実行できるようにするコードがあります。

于 2012-08-16T19:39:14.557 に答える