2019-07-07

/usr/pkg/qt5/lib/libQt5XcbQpa.so.5: Undefined PLT symbol "FT_Get_Font_Format" (symnum = 407)

dynabook SS SX/15AにNetBSD/i386を入れて利用しています。先月以来アプリケーションを更新するために四苦八苦してきましたが、ようやく落ち着いてき(たと思ってい)ました。

元々このマシンはMicrosoft Windows Vistaがインストールされていました。OSをNetBSDにしましたが、使い勝手を同等にしようと考えていたので、その意図を満たせるアプリケーションを入れていました。そのひとつがKeePassです。Microsoft WindowsではIDMを使っていましたので、代替ソフトとしてKeePassを選んでみました。KeePass以外にも、KeePassXKeePassXCがあることを承知していますが、IDMの代替ソフトを探していた当時はpkgsrcにKeePassXCが入っていませんでした。KeePassXは機能的に満足せず、消去法でKeePassを選択しました。

KeePassはC#で書かれているそうです。NetBSDではMonoという実装を使っており、あまり具合が良くありません。特に問題なのが、pkgsrcからのビルドでトラブルを起こすことです。また実行中におちたりしますが、これはMonoが悪いのか、マシンの環境の何かの不具合なのか見極められていません。KeePass自体は悪くないと思うのですが、Monoにはうんざりしていました。ありがたいことにpkgsrcにはKeePassXCが入っているので、KeePassからKeePassXCに乗り換えることにしました。

KeePassXCを起動しようとしたら、次のようなエラーが出て動きません。調査しようと思って先延ばしにしていましたが、実は同じエラーがwiresharkでも出ていました。
/usr/pkg/qt5/lib/libQt5XcbQpa.so.5: Undefined PLT symbol "FT_Get_Font_Format" (symnum = 407)

この問題を解決しようとWebに情報を求めましたが、解決に至るような情報を見つけられませんでした。念のために、いつものように、/usr/bin/lddで共有ライブラリの参照状況を確認してみましたが、参照不能はありませんでした。しかし参照状況が怪しいものが見つかりました。freetype.17を参照しようとしてlibfreetype.so.18を見にいっています。
-lfreetype.17 => /usr/X11R7/lib/libfreetype.so.18
libfreetype.so/usr/X11R7/libにあるので確認してみました。するとlibfreetype.so.18のリンク先がlibfreetype.so.17.4.11になっています。
lrwxr-xr-x  1 root  wheel      22 May 23  2016 /usr/X11R7/lib/libfreetype.so -> libfreetype.so.17.4.11
lrwxr-xr-x  1 root  wheel      22 May 23  2016 /usr/X11R7/lib/libfreetype.so.17 -> libfreetype.so.17.4.11
-r--r--r--  1 root  wheel  589796 May 23  2016 /usr/X11R7/lib/libfreetype.so.17.4.11
lrwxrwxr-x  1 root  wheel      22 Jul  7 14:34 /usr/X11R7/lib/libfreetype.so.18 -> libfreetype.so.17.4.11
このシンボリックリンクは、何時頃のことなのか記憶に定かではありませんが、自分で作りました。何かのアプリケーションがlibfreetype.so.18を必要としており、このようにリンクを張ったら動作したので、それで解決したと思っていました。それが今頃になって悪さをしているようです。

それでは本物のlibfreetype.so.18は何処にあるのでしょうか。調べてみるとNetBSD 8.0が提供するxbase.tgzに含まれているようです。考えてみると、このマシンにNetBSDを導入した時はNetBSD 7.0.1でした。その時はlibfreetype.so.17だったのでしょう。その後にソースからビルドしたNetBSD 8.99系に更新しましたが、X関係は手付かずのままだったようです。

障害の原因は見えてきたので、NetBSD 8.0に含まれているX関係コンポーネントを全て入れることで、NetBSD 7.0.1時代のX関係コンポーネントを上書きしました。これでkeepassxcが動くことを確認しました(wiresharkも)。
lrwxr-xr-x  1 root  wheel       22 Jul 17  2018 /usr/X11R7/lib/libfreetype.so -> libfreetype.so.18.0.13
lrwxr-xr-x  1 root  wheel       22 May 23  2016 /usr/X11R7/lib/libfreetype.so.17 -> libfreetype.so.17.4.11
-r--r--r--  1 root  wheel   589796 May 23  2016 /usr/X11R7/lib/libfreetype.so.17.4.11
lrwxr-xr-x  1 root  wheel       22 Jul 17  2018 /usr/X11R7/lib/libfreetype.so.18 -> libfreetype.so.18.0.13
-r--r--r--  1 root  wheel   613332 Jul 17  2018 /usr/X11R7/lib/libfreetype.so.18.0.13

これまでNetBSDの更新は/usr/srcでビルドして入れ換えていましたが、/usr/xsrcは何もしていませんでした。X関係を更新するのがNetBSDのメジャー番号が上がった場合だけで良いなら、今回同様にキットから展開すればよいでしょう。それともソースからビルドして入れ換える必要があるのか、調べておきたいと思います。

0 件のコメント:

コメントを投稿