【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

libcなしでexit (2)

id:n7shi:20100201の続きです。インラインアセンブラIntel形式にしてみました。

void start()
{
	int m[] = { 0, 1/*EXIT*/, 42, 0, 0, 0, 0, 0, 0 };
	asm("mov eax, 0; mov ecx, 3; int 0x21" :: "b"(m));
}
# gcc -masm=intel -nostdinc -nostdlib exit.c
# ./a.out; echo $?
42

アセンブリ

アセンブリを出力します。

gcc -masm=intel -nostdinc -S exit.c

出力されたexit.sを削って整理しました。

.intel_syntax
.text
start:
	mov eax, 0
	mov ebx, offset flat:msg
	mov ecx, 3
	int 0x21
msg:
	.long 0; .long 1; .long 42; .long 0; .long 0
	.long 0; .long 0; .long 0; .long 0
# gcc -nostdlib exit.s
# ./a.out; echo $?
42

C言語のバイナリは382バイトでしたが、プロローグ・エピローグ・セクションなどを削ったため311バイトに縮みました。シンボルが残っているためgstrip(stripはACKでコンパイルしたバイナリしか処理できない)で削ると、C言語は168バイト、アセンブリは104バイトとなりました。

ゴルフが目的ではないのでサイズ縮小はこのくらいにして、次はa.outファイルの解析に入っていきます。ACKではなくgccを使っているのは、単にACKの使い方が良く分からないためです。