流行に乗り遅れたが

筆者の周囲でも流行した「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 により既出だった。