DockerのAlpine公式イメージでは動かなかったので、原因を調べました。
$ ./TerrariaServer.bin.x86_64
sh: ./TerrariaServer.bin.x86_64: not found
何が “not found” なのか?
→ glibc
file
, ldd
で確認してみます。
$ apk add file
$ file TerrariaServer.bin.x86_64
TerrariaServer.bin.x86_64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3a8a864d0d6d2ae12bbed4100ba4151a40f1c1e3, with debug_info, not stripped
$ ldd TerrariaServer.bin.x86_64
/lib64/ld-linux-x86-64.so.2 (0x7f648c25f000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f648c25f000)
librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f648c25f000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f648c25f000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f648c25f000)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by TerrariaServer.bin.x86_64)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f648c25f000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by TerrariaServer.bin.x86_64)
Error relocating TerrariaServer.bin.x86_64: __isnanf: symbol not found
Error relocating TerrariaServer.bin.x86_64: backtrace: symbol not found
Error relocating TerrariaServer.bin.x86_64: __finite: symbol not found
Error relocating TerrariaServer.bin.x86_64: backtrace_symbols: symbol not found
Error relocating TerrariaServer.bin.x86_64: __isnan: symbol not found
Error relocating TerrariaServer.bin.x86_64: _Unwind_GetIP: symbol not found
Error relocating TerrariaServer.bin.x86_64: _Unwind_Backtrace: symbol not found
Error relocating TerrariaServer.bin.x86_64: __isinf: symbol not found
ということで、/lib64/libgcc_s.so.1
, ld-linux-x86-64.so.2
が足りないことがわかりました。
libgcc_s.so.1
libgcc
パッケージをインストールする。
$ apk add libgcc
$ ldd TerrariaServer.bin.x86_64
...
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f8728081000)
...
解決
ld-linux-x86-64.so.2
musl libc からシンボリックリンクを貼る。
$ mkdir /lib64
$ ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
$ ldd TerrariaServer.bin.x86_64
...
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by ./TerrariaServer.bin.x86_64)
Error relocating ./TerrariaServer.bin.x86_64: __isnanf: symbol not found
Error relocating ./TerrariaServer.bin.x86_64: backtrace: symbol not found
Error relocating ./TerrariaServer.bin.x86_64: __finite: symbol not found
Error relocating ./TerrariaServer.bin.x86_64: backtrace_symbols: symbol not found
Error relocating ./TerrariaServer.bin.x86_64: __isnan: symbol not found
Error relocating ./TerrariaServer.bin.x86_64: __isinf: symbol not found
だめ
libc6-compat
パッケージを追加すれば解決するという記事もありますが、これは↑と同じようにシンボリックリンクを貼るだけのようです。
どうやら glibc と musl libc の実装の違いによるもの?っぽいです。適当に調べた感じfloat型の扱いの差みたいなやつだと思います。
とにかく musl libc には無い関数を呼ばれているので musl libc では動きません。
逆に言えば仕様が共通する範囲でなら↑の方法で動くみたいですね。
解決策: glibc 入り Alpine イメージを使う
frolvlad/alpine-glibc というのがあったので何も考えずに使ってみました。
素の Alpine イメージが約4MBに対し、こちらは約12MBです。
どうなったか
動きました。
まとめ
Cライブラリにもいろいろあるんだな〜と思いました(小学生並みの感想)
おわり
参考
- GNU ldで一部をスタティックリンクにする - fukasawah’s blog
- Alpine Linuxあるある - Qiita
- glibc がリンクされた binary を alpine 上で動かしたい - Qiita
- Alpine Linux で適当なバイナリを持ってきて動かす備忘録
そういえばGoバイナリとかはどうなんだと思った