そんな疑問に挑戦してみたいと思います。
ただし、Windows上でエラーにならずに実行されれば、どんな手段(バイナリエディタを含む)で作っても構いません。
今回自分が使用したのは、gcc version3.2.3です。
まずは普通に何もしないプログラムをC言語で書いてコンパイルしてみます。 コンパイル 結果は14,451 バイトのexeファイルが生成されました。
次に、
http://d.hatena.ne.jp/propella/20080812/p1
このサイトを参考に、アセンブリで書いてみました。 コンパイル(?)
as -o omake2.o omake2.s
ld -o omake2.exe omake2.o -subsystem windows -lkernel32 -LC:\MinGW\lib
しかし、生成されたexeをバイナリエディタで見てみると、後ろに謎の文字列が大量についています。
これを消せないかと思って、ldに大量のオプションをつけてみました。
ld -o omake2.exe omake2.o -subsystem
windows -lkernel32 -LC:\MinGW\lib --no-define-common --strip-discarded -s -O -x
--gc-sections -nostdlib
「キリのいい」数字であり、バイナリエディタで見ても謎の文字列はありません。
…が、大量に00があるのが気になります。
これはないといけないものなのでしょうか?
また、どちらの実験でもそうなのですが、ldが というメッセージを吐きました。
実行はできたように見えるのですが、これは消せないのでしょうか?
とりあえず、自分の実験はここまでです。
もっと小さい、「正しい」exeファイルの作り方がわかったら、是非教えてください。
今回使用したファイルを添付しておきます。