Elixir ソースコードの中にバイナリを埋め込みたいとする.Elixir ソースコードはテキストファイルである.テキストファイルの中にどのようにバイナリを埋め込むとよいだろうか.
Elixir では(もちろん Erlang でも)バイナリを表現する方法が用意されている.Binaries, strings, and char listsにあるとおり<<0, 255, 127>>
のように記述する.
それでは,バイナリをこのような 0..255
の表現で取得するにはどうしたらよいか.hexdump
というコマンドでバイナリを様々なフォーマットで出力できる.
今回は
-
ls
のバイナリをhexdump
で Elixir 内で扱えるバイナリ文字列へと変換する - Elixir 内で扱えるバイナリ文字列を Elixir で読み込む
- Elixir 内で扱えるバイナリ文字列を Elixir からバイナリとして書き出す
- 書き出したバイナリを実行して,
ls
と同じ動作をすること
を確かめた.
/var/tmp/elixir_binary% hexdump -ve '/1 "%u,"' /bin/ls | sed -e 's/,*\r*$//' | awk '{print "<<"$0">>"}' > elixir_binary.txt
/var/tmp/elixir_binary% head -c 100 elixir_binary.txt
<<207,250,237,254,7,0,0,1,3,0,0,128,2,0,0,0,18,0,0,0,8,7,0,0,133,0,32,0,0,0,0,0,25,0,0,0,72,0,0,0,95% /var/tmp/elixir_binary% iex
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> {result, _bindings} = Code.eval_file("elixir_binary.txt")
{<<207, 250, 237, 254, 7, 0, 0, 1, 3, 0, 0, 128, 2, 0, 0, 0, 18, 0, 0, 0, 8, 7, 0, 0, 133, 0, 32, 0, 0, 0, 0, 0, 25, 0, 0, 0, 72, 0, 0, 0, 95, 95, 80, 65,
71, 69, 90, 69, 82, ...>>, []}
iex(2)> File.write!("myls", result)
:ok
iex(3)>
User switch command
--> q
/var/tmp/elixir_binary% chmod 755 myls
/var/tmp/elixir_binary% ./myls -l
total 296
-rw-r--r-- 1 niku wheel 108227 5 4 20:53 elixir_binary.txt
-rwxr-xr-x 1 niku wheel 38512 5 4 20:55 myls
/var/tmp/elixir_binary% diff /bin/ls myls