Ubuntu 64bit環境で32bit版のscratch(squeak) vmを使う

Ubuntu 64bit環境でインストールできる scratch vm で Scratch Source Code Licenced な Scratch 1.4 のイメージを開こうとすると、しばらくフリーズしたあとに core dumped で終了してしまいます。

これは scratch vm のベースとなっている squeak vm のバージョンが 4.10 となっているからのようです。Scratch Source Code Licenced なイメージを開くには 3.9.8 のバージョンでなければ駄目なようで、このブログでも VM の作り方を説明しました。

Ubuntu 環境をクリーンインストールしたりすると、ビルドしたファイルをバックアップしていても関連するライブラリを再インストールしなければなりません。この手順を控えず、何度もやりなおしていたので、記事としてまとめておきます。

scratch vm の準備

当然のことながら、これ以降で説明する作業はすべて自己責任で行ってください。当方はいかなるトラブルが発生しても責任を負いかねます。

すでにビルド済の実行ファイルや共有ライブラリは存在しているものとします。そうでない人のために、こっそりバイナリを公開しておきます。ダウンロードしておいてください。

ダウンロードしたファイルは /usr/local ディレクトリ配下に展開しておきます。(ファイルは Downloads にあるものとします)

$ cd /usr/local/
$ sudo tar xzf ~/Downloads/scratch-bin.tgz

ファイルの確認

scratch vm のファイルが存在することを確認します

$ ls -l /usr/local/bin/squeak
lrwxrwxrwx 1 itoh itoh 26 8月 15 20:01 /usr/local/bin/squeak -> ../lib/squeak/3.9-8/squeak
$ ls -l /usr/local/lib/squeak/3.9-8/AioPlugin
-rwxr-xr-x 1 itoh itoh 12104 8月 15 20:25 /usr/local/lib/squeak/3.9-8/AioPlugin
$ file /usr/local/lib/squeak/3.9-8/AioPlugin
AioPlugin: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=2384d92fbbfdd05e98eac6b3fc2d3d00e0fd4e4f, not stripped

ldd で必要なライブラリが何かを確認します。

$ ldd /usr/local/bin/squeak
動的実行ファイルではありません
$ ldd /usr/local/lib/squeak/3.9-8/AioPlugin
動的実行ファイルではありません

素の64bit環境の状態では ldd を使って必要なライブラリを調べることすらできません。そこで、必要最小限の32bit関連ライブラリをインストールしていきましょう。

32bit関連ライブラリのインストール

以下を実行します。

$ sudo dpkg --add-architecture i386
$ sudo apt update
(省略)
$ sudo apt -y install lib32z1
(省略)

これで vm が必要するライブラリを調べることができるようになります。

$ ldd /usr/local/lib/squeak/3.9-8/AioPlugin 
linux-gate.so.1 (0xf7f90000)
libc.so.6 => /lib32/libc.so.6 (0xf7d95000)
/lib/ld-linux.so.2 (0xf7f92000)
$ ldd /usr/local/lib/squeak/3.9-8/UnicodePlugin
linux-gate.so.1 (0xf7f58000)
libpangocairo-1.0.so.0 => not found
libpango-1.0.so.0 => not found
libgobject-2.0.so.0 => not found
libglib-2.0.so.0 => not found
libcairo.so.2 => not found
libc.so.6 => /lib32/libc.so.6 (0xf7d5d000)
/lib/ld-linux.so.2 (0xf7f5a000)

UnicodePlugin で pango/cairo 関係のライブラリが不足していることがわかります。ライブラリをインストールするパッケージを探すには apt-file を使うのでインストールします。その後、パッケージデータベースを更新します。

$ sudo apt -y install apt-file
(省略)
$ sudo apt update
(省略)

apt-file を使って libpangocairo をインストールするパッケージを探します。

$ apt-file search libpangocairo-1.0.so.0
libpangocairo-1.0-0: /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0
libpangocairo-1.0-0: /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0.4000.14

共有ライブラリである libpangocairo-1.0.so.0 をインストールするのは libpangocairo-1.0-0 だとわかるので、i386アーキテクチャのライブラリをインストールします。

$ sudo apt -y install libpangocairo-1.0-0:i386
(省略)

関連するライブラリがごっそりインストールされます。インストール完了かと思いますが、念のために他に必要なものがないか確認します。

$ ldd /usr/local/lib/squeak/3.9-8/* | grep found
libasound.so.2 => not found

libasound がないので apt-file でパッケージを探します。

$ apt-file search libasound.so.2
libasound2: /usr/lib/x86_64-linux-gnu/libasound.so.2
libasound2: /usr/lib/x86_64-linux-gnu/libasound.so.2.0.0
liboss4-salsa-asound2: /usr/lib/x86_64-linux-gnu/libasound.so.2

libasound2 をインストールします。

$ sudo apt -y install libasound2:i386
(省略)

以上で必要な共有ライブラリはインストールできました。 squeak を起動できることを確認しましょう。

$ squeak
Could not open the Squeak image file `squeak.image'.
There are three ways to open a Squeak image file. You can:
Put copies of the default image and changes files in this directory.
Put the name of the image file on the command line when you
run squeak (use the `-help' option for more information).
Set the environment variable SQUEAK_IMAGE to the name of the image
that you want to use by default.
For more information, type: `man squeak' (without the quote characters).

なお、イメージを指定して vm を起動するとき、初回だけフリーズしたようになります。これは時間がかかっているだけで、しばらくすると画面が表示されるので気長に(1分程度)待ってください。

Plugin 開発用にパッケージをインストールする

scratch vm を利用するだけならば以上でOKですが、プラグインも開発したい場合には以下のパッケージをインストールしておきます。

$ sudo apt -y install gcc-multilib