Terraria サーバーを Alpine で動かそうと思ったらダメだったやつの覚え書き

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ライブラリにもいろいろあるんだな〜と思いました(小学生並みの感想)

おわり

参考

そういえばGoバイナリとかはどうなんだと思った

Linux  game