kubo39's blog

ただの雑記です。

例によって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)

まとめた一式:

kubo39/tinycr · GitHub

Ubuntu trusty環境だとパッケージのlibgcが古くて使えなかったので、ソースからビルドする形にした.

必要なセクションだけまとめてバイナリから抜き出したりとか、まだまだ小さくできる. というかまだ大きすぎる.