2021年10月06日

LuaAppMaker の AppImage を作る:なるべく古いシステムでビルドする

 「LuaAppMaker の AppImage を作る (wxWebView オプショナル版)」の続きです。AppImage の公式ドキュメントによれば、「現在サポートされているできるだけ古い Linux システムでビルドすることが望ましい」とされています。

It is considered best practice to develop and compile the application on the oldest still-supported Linux distribution that we can assume users to still use. For example, the oldest still-supported LTS release of Ubuntu is a good choice to develop applications against and build applications on.

Concept - AppImage Document

 そこで、Ubuntu 14.04 でビルドしてみました。結論から言うと、うまくいかなかったんですが。

 wxWidgets 3.1.5, LuaJIT-2.1.0-beta3, wxLua のビルドは、まあ問題なかったのですよ。EGL 絡みでエラーが出て、EGL のサポートを外したりもしたけど、それは大きな問題じゃない。問題は、前回やった「LuaAppMaker 本体を共有ライブラリとしてリンクして、wxwebview.so を作る」という段階。こんなエラーが出る。

/usr/bin/ld: /mnt/hgfs/wxMyProjects/LuaAppMaker/build-ubuntu/build/debug/wxwebview.so: シンボル _ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3 用のバージョンノードが見つかりません

 gcc が古い(バージョン 4.7)からかな?と思い、gcc-8 をインストールしてみた。また、ld (binutils) が古いのかな?と思い、最新の 2.37 をビルドしてみた。どちらもダメ。エラーメッセージは少し変わった。

/usr/local/bin/ld: LuaAppMaker: _ZTVN10__cxxabiv117__class_type_infoE: 無効なバージョン 10 (最大 0) LuaAppMaker: error adding symbols: 不正な値です

 リンク時の「シンボルのバージョン」と関係しているらしい、というところまでは判ったけど、そこから先にどうしても進めない。英語のエラーメッセージは invalid version 10 (max 0) となっていて、これで検索するとたくさん情報が出てくるのだが、今回の問題の解決につながるような情報がまだ見つかってない。

 試しに Debian 9 (Stretch) でもビルドしてみた。こっちは通るんですよ。gcc の設定なども少し異なるようなんだけど、どこが効いているのか全然わからない。

 一つ違いを見つけた。LuaAppMaker の実行ファイル中のシンボルを readelf で読んで、上でエラーが出たシンボルを抽出してみる。Debian 9 ではこうなる。

$ readelf -Ws build/release/LuaAppMaker/LuaAppMaker | grep __class_type_info

567: 00000000 0 OBJECT GLOBAL DEFAULT UND _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3 (12)

 一方、Ubuntu 14 ではこうなる。

$ readelf -Ws build/release/LuaAppMaker/LuaAppMaker | grep __class_type_info

7874: 0126891c 44 OBJECT WEAK DEFAULT 23 _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3 (10)

45559: 0126891c 44 OBJECT WEAK DEFAULT 23 _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3

 Debian ではこのシンボルは UND(未定義)のままなのだが、Ubuntu14 ではアドレスが決まっている。どちらが正しいのかわからない。

 現時点の自分の実力では、これ以上踏み込むのは無理だと思う。今回は諦めて、Debian 9 で AppImage を作ることにした。まあ、主要なターゲットは Raspberry Pi OS で Debian 系なので、問題ないとも言える。

Posted at 2021年10月06日 23:54:48
email.png