例によってcrystalのソースコードからどのくらい小さいバイナリを作れるか試すということをやった.
暫定的にここまでやった試みとしては、以下のとおり.
curl "http://crystal-lang.s3.amazonaws.com/pcl/libpcl-1.12-1-linux-x86_64.tar.gz" | tar xz -C /tmp git clone git://github.com/ivmai/libatomic_ops.git git clone git://github.com/ivmai/bdwgc.git ln -s `pwd`/libatomic_ops `pwd`/bdwgc/libatomic_ops cd bdwgc autoreconf -vif automake --add-missing ./configure make cd .. export LIBRARY_PATH=/tmp/libpcl-1.12-1/lib:./bdwgc/.libs crystal build hello.cr --release --emit obj gcc hello.o -o hello -s -l:libpcre.a -l:libgc.a -l:libevent.a -l:libpcl.a -lpthread -lunwind wc -c < hello
WRITE = 1_u64 def syscall(n, arg1, arg2, arg3 : UInt64) : UInt64 dst :: UInt64 asm("syscall" : "={rax}"(dst) : "{rax}"(n), "{rdi}"(arg1), "{rsi}"(arg2), "{rdx}"(arg3) : "rcx", "r11", "memory" : "volatile") return dst end b = "Hello!\n".bytes syscall(WRITE, 1_u64, b.buffer.address, b.size.to_u64)
まとめた一式:
Ubuntu trusty環境だとパッケージのlibgcが古くて使えなかったので、ソースからビルドする形にした.
必要なセクションだけまとめてバイナリから抜き出したりとか、まだまだ小さくできる. というかまだ大きすぎる.