流行に乗り遅れたが
筆者の周囲でも流行した「Binary Hack」にインスパイヤされてみた。
環境は FreeBSD 6.1 (AMD64) で、試したのは libc なしの Hello, world.
#include <sys/syscall.h> .section .rodata .HELLO: .ascii "Hello, world.\n" .globl _start .section .init _start: movq $SYS_write, %rax movq $1, %rdi movq $.HELLO,%rsi movq $14,%rdx syscall movq $SYS_exit, %rax syscall
システムコールの呼び方は /usr/src/lib/libc/amd64/SYS.h を見る。AMD64 の場合は syscall 命令だ。システムコール番号と引数をレジスタに入れて叩く。システムコール番号自体は sys/syscall.h に書かれているので include した。
このファイル hello.S を gcc -nostdlib hello.S でアセンブルすると、a.out のサイズが 1460byte, strip して 736byte だ。さらに .data と .bss を strip して、できたファイルは592byteとなった。あと .shstrtab なるセクションが残っているが、これは除去できず。検索した所、セクション名文字列のテーブルらしい。
追記: かなり既出ネタ。
はてな内でも、 id:SumiTomohiko:20061221 により既出だった。