「風が吹けば桶屋が儲かる」
元々の意味としては
mate-calcのSeg.fault
ある日
この報告には
確認のためVirtualBox上の仮想環境にPlamo-7.
$ mate-calc Segmentation fault
どこで落ちているのか確認するため"gdb"を使ってみても、落ちたアドレスこそわかるものの、該当するライブラリ等は"?? ( )"になっています。
$ gdb /usr/bin/mate-calc GNU gdb (GDB) 12.1 Copyright (C) 2022 Free Software Foundation, Inc. ... (gdb) run Starting program: /usr/bin/mate-calc [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/libthread_db.so.1". [New Thread 0x7ffff3aec640 (LWP 14533)] [New Thread 0x7ffff32eb640 (LWP 14534)] .. [Thread 0x7ffff22e9640 (LWP 14540) exited] Thread 1 "mate-calc" received signal SIGSEGV, Segmentation fault. 0x00007ffff3d77af0 in ?? () (gdb)
コマンドの実行時、どのようなライブラリがメモリ空間のどこにロードされるかは、/proc/〈pid〉/mapsで確認することができます。"ps"コマンドでmate-calcのプロセス番号
$ ps ax | grep mate-calc 14524 pts/3 Sl+ 0:00 gdb /usr/bin/mate-calc 14530 pts/3 tl 0:00 /usr/bin/mate-calc 14568 pts/5 S+ 0:00 grep mate-calc
そこで/proc/
$ cat /proc/14530/maps | less 00400000-0040e000 r--p 00000000 08:02 4922350 /usr/bin/mate-calc 0040e000-0042e000 r-xp 0000e000 08:02 4922350 /usr/bin/mate-calc 0042e000-00442000 r--p 0002e000 08:02 4922350 /usr/bin/mate-calc ... 7fffdad3e000-7fffdc000000 r--s 00000000 08:02 35293332 /usr/share/anthy/anthy.dic 7fffdc000000-7fffdc07b000 rw-p 00000000 00:00 0 ... 7ffff3d2d000-7ffff3d2e000 r--p 0001e000 08:02 100669254 /usr/lib/gconv/libJISX0213.so 7ffff3d2e000-7ffff3d2f000 rw-p 0001f000 08:02 100669254 /usr/lib/gconv/libJISX0213.so 7ffff3d2f000-7ffff3df2000 rw-p 00000000 00:00 0 <-- 7ffff3d777af0 はこのあたり 7ffff3df2000-7ffff3df5000 r--p 00000000 08:02 100669654 /lib/libnss_files-2.33.so 7ffff3df5000-7ffff3dfc000 r-xp 00003000 08:02 100669654 /lib/libnss_files-2.33.so 7ffff3dfc000-7ffff3dfe000 r--p 0000a000 08:02 100669654 /lib/libnss_files-2.33.so
予想通りSeg.
状況確認
gdb等ではめぼしい情報が得られなかったので、もう少し状況証拠を集めてみることにしました。mate-calcは素のままのPlamo-7.
このような作業にはVirtualBoxのスナップショット機能が便利です。まずは一度、スナップショットを記録していたインストール直後の状態に戻し、そこから更新パッケージをアップデートしていって、どこでmate-calcがエラーになるかを調べます。
もっとも100くらいあるパッケージを1つずつ調べていくと時間がかかりすぎるので、とりあえずPlamo Linuxのパッケージカテゴリー単位でチェックしました。mate-calcはMateデスクトップ用の電卓ソフトウェアなので、まずは関係がありそうなX回りのパッケージや関連ライブラリ回りから試したものの、mate-calcがSeg.
「うーん……」
Plamo Linuxでは、カーネルやglibc、bashといった必須のパッケージは00_
とりあえず01_
状況は確認できたものの、その結果にはさらに首を捻ることになりました。なぜならgnutlsは通信経路を暗号化するソフトウェアであるのに対し、mate-calcは電卓ソフトウェアで両者の間には何の関連もありません。実際、mate-calcが必要とするライブラリとgnutlsが提供するライブラリの間にも何ら接点はありません。さてこれはいったいどうしたものでしょう?
押してダメなら引いてみる
とりあえずmate-calcのSeg.
そこでこれらのバージョンのChangeLogあたりを眺めてみたものの、特に影響しそうな変更等は見当りません。いよいよ万策尽きたか……と思いかけたころ、
gnutlsはTLS
$ sudo removepkg gnutls [sudo] kojima のパスワード: Removing package gnutls... Removing files: --> Deleting symlink usr/lib/libgnutls.so --> Deleting symlink usr/lib/libgnutls.so.30 ... $ mate-calc libgnutls.so.30: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません Failed to load module: /usr/lib/gio/modules/libgiognutls.so
「ビンゴ!」
$ grep libgiognutls.so /var/log/packages/* /var/log/packages/glib_networking:usr/lib/gio/modules/libgiognutls.so $ head /var/log/packages/glib_networking PACKAGE NAME: glib_networking-2.54.1-x86_64-B2 COMPRESSED PACKAGE SIZE: 83 K UNCOMPRESSED PACKAGE SIZE: 230 K PACKAGE LOCATION: /var/adm/mount/plamo/05_ext/glib_networking-2.54.1-x86_64-B2.txz PACKAGE DESCRIPTION: glib_networking: Glib用ネットワーク関連モジュール glib_networking: glib_networking: Glibにネットワーク関連の機能を追加するためのgiomodule群 ...
一方、glib-networkingの開発元のサイトを確認すると、最新版はバージョン2.
glibはGNOME系のソフトウェアが利用している汎用ライブラリで、メモリ管理や文字列操作、ファイル入出力等の機能を抽象化して、CPUの種類やOSに関わらず、同じ手順で利用できるようにします。GIO
mate-calcがglibを必要とするのは"readelf -d"等で必要な共有ライブラリを調べた際にわかっていました。一方glibでは、入出力回りを扱うGIO関連の機能はモジュールとして必要に応じて動的にロードする設計になっており、その結果、glibが依存するライブラリを調べるだけではgnutlsとの関連がわからなかったのでした。
というわけで、
「gnutlsを更新するとmate-calcがSeg.
そこで本稿を執筆するにあたり、改めてmate-calcのソースコードを調べてみたところ、mate-calcの
「風が吹けば…」