octahedron

LemとSKKとCommon Lispでたたかうプログラマのブログ

OneShot (ゲーム)をUbuntu 18.04で動かす

あらまし

 先日、チャンスは一度きりなゲームOneShotGNU/Linux版がリリースされました。ふだんUbuntuのLTS版を利用しているので、いままでWindows 10に切り替えなければ遊べなかったOneShotをいつもの環境で起動できるのはとてもうれしいです。

steamcommunity.com

 しかし要求してくるライブラリのバージョンがとても新しく、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つだけ足りない! それにしてもglibclsといった各コマンド自体も依存している動的ライブラリですので、ディストリビューションが提供するアップデートなしには容易に差し替えられません。ちなみに「OneShot用のglibcコンパイルしてゲーム本体のディレクトリに置けばいいじゃん」とやってみたところダメでした。差し替えたglibcを向くようにLD_PRELOAD環境変数で指定しても.so中のオブジェクト等の位置が異なるのかセグフォになります。むずかしいですね。

対処方法

 このスレッドにも書かれているのですが、glibcを差し替えて解決するのではなく新しいglibcに依存しているライブラリを使わないようにするのが楽かつスマートです。

steamcommunity.com

 つまり、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への認証っぽいログがでたあと…。

f:id:t-sin:20190502000343p:plain
OneShot起動成功!

 やったー!!

 あとは遊びましょう。