みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

最小のexeファイルを目指して

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

最小のexeファイルを目指して

投稿記事 by みけCAT » 12年前

何もしないがエラーも出ず実行できる、そんなexeファイルの中で、最も小さいもののサイズは何バイトだろう?
そんな疑問に挑戦してみたいと思います。
ただし、Windows上でエラーにならずに実行されれば、どんな手段(バイナリエディタを含む)で作っても構いません。

今回自分が使用したのは、gcc version3.2.3です。

まずは普通に何もしないプログラムをC言語で書いてコンパイルしてみます。

CODE:

main(){}
コンパイル

CODE:

gcc -o omake.exe omake.c
結果は14,451 バイトのexeファイルが生成されました。

次に、
http://d.hatena.ne.jp/propella/20080812/p1
このサイトを参考に、アセンブリで書いてみました。

CODE:

_mainCRTStartup:
	pushl $0
	call _ExitProcess@4
コンパイル(?)

CODE:

as -o omake2.o omake2.s
ld -o omake2.exe omake2.o -subsystem windows -lkernel32 -LC:\MinGW\lib
結果は4,216 バイトになりました。
しかし、生成されたexeをバイナリエディタで見てみると、後ろに謎の文字列が大量についています。
これを消せないかと思って、ldに大量のオプションをつけてみました。

CODE:

ld -o omake2.exe omake2.o -subsystem
 windows -lkernel32 -LC:\MinGW\lib --no-define-common --strip-discarded -s -O -x
 --gc-sections -nostdlib
この結果は、2,048 バイトでした。
「キリのいい」数字であり、バイナリエディタで見ても謎の文字列はありません。
…が、大量に00があるのが気になります。
これはないといけないものなのでしょうか?

また、どちらの実験でもそうなのですが、ldが

CODE:

ld: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000
というメッセージを吐きました。
実行はできたように見えるのですが、これは消せないのでしょうか?

とりあえず、自分の実験はここまでです。
もっと小さい、「正しい」exeファイルの作り方がわかったら、是非教えてください。
今回使用したファイルを添付しておきます。
添付ファイル

[拡張子 zip は無効化されているため、表示できません]


アバター
へろりくしょん
記事: 92
登録日時: 13年前

Re: 最小のexeファイルを目指して

投稿記事 by へろりくしょん » 12年前

正しいというのは、DOSのスタブプログラムもきちんと実行されなければならない。 と言う事でしょうか。
バイナリエディタでベタ書きして、とりあえず312バイトのexeが出来ました。

アバター
bitter_fox
記事: 607
登録日時: 13年前

Re: 最小のexeファイルを目指して

投稿記事 by bitter_fox » 12年前

へろり さんが書きました: バイナリエディタでベタ書きして、とりあえず312バイトのexeが出来ました。
バイナリエディタでベタ書きとかギークすぎるwww