OneShot (ゲーム)をUbuntu 18.04で動かす
あらまし
先日、チャンスは一度きりなゲームOneShotのGNU/Linux版がリリースされました。ふだんUbuntuのLTS版を利用しているので、いままでWindows 10に切り替えなければ遊べなかったOneShotをいつもの環境で起動できるのはとてもうれしいです。
しかし要求してくるライブラリのバージョンがとても新しく、LTS版では起動できませんでした。この記事ではそれをなんとかしてみます。
発生現象
Steam GNU/Linux版でOneShotをダウンロード後に起動しようとすると起動中っぽい動きを一瞬したあとそのままなにも起こりません。これはプログラムの起動に失敗して無言で落ちているためであり、ターミナルで直に起動しようとしてみると以下のような出力が得られます。
# OneShotがインストールされたディレクトリに移動 $ cd ~/.local/share/Steam/steamapps/common/OneShot # 起動 (失敗) $ ./oneshot ./oneshot: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /home/grey/.local/share/Steam/steamapps/common/OneShot/libgio-2.0.so.0) ./oneshot: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /home/grey/.local/share/Steam/steamapps/common/OneShot/libglib-2.0.so.0) ./oneshot: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /home/grey/.local/share/Steam/steamapps/common/OneShot/libsystemd.so.0)
これは、システムにインストールされたglibcライブラリのバージョンが古いと言っています。システムの情報とglibcのバージョンを確認してみると、以下のようでした。
# 環境情報の確認 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS" grey@timberwolf:~$ /lib/x86_64-linux-gnu/libc libc-2.27.so libc.so.6 # glibcのバージョン確認 $ /lib/x86_64-linux-gnu/libc.so.6 GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1) stable release version 2.27. Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled by GNU CC version 7.3.0. libc ABIs: UNIQUE IFUNC For bug reporting instructions, please see: <https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
おしい! 1つだけ足りない! それにしてもglibcはls
といった各コマンド自体も依存している動的ライブラリですので、ディストリビューションが提供するアップデートなしには容易に差し替えられません。ちなみに「OneShot用のglibcをコンパイルしてゲーム本体のディレクトリに置けばいいじゃん」とやってみたところダメでした。差し替えたglibcを向くようにLD_PRELOAD
環境変数で指定しても.so中のオブジェクト等の位置が異なるのかセグフォになります。むずかしいですね。
対処方法
このスレッドにも書かれているのですが、glibcを差し替えて解決するのではなく新しいglibcに依存しているライブラリを使わないようにするのが楽かつスマートです。
つまり、OneShotディレクトリにある新しいglibcに依存する.soは削除もしくはリネームしてしまい、システムにapt等で対応するライブラリを入れましょう。
$ cd ~/.local/share/Steam/steamapps/common/OneShot $ rm libgio-2.0.so.0 libglib-2.0.so.0 libsystemd.so.0
これでglibcのエラーはでなくなります。
そのあと
ぼくの環境では、この後Error initializing SDL: Could not initialize UDEV
というエラーがでてまだ起動できませんでした。udevとはユーザ空間でデバイスドライバを動的にロードしたりするライブラリっぽいのですが、きっとシステムのものではないudevを用いているせいかもしれない(libudev.so.1
が実際ある)のでこれも消してしまいましょう。
そうするとエラーの内容がCould not initialize Steamworks API
に変わります。きっとStreamが起動していて認証されてないと動かないのでしょうね。そこで、今まで./oneshot
を起動していたのですが同じディレクトリにある./steamshim
を起動してみましょう。Steamへの認証っぽいログがでたあと…。
やったー!!
あとは遊びましょう。