2017/05/29

gkrellm-ledsがUbuntu 17.04で動かない問題と対処

キーボードのLED(NumLock, CapsLock, ScrollLock)の状態をGKrellM内に表示するプラグイン(gkrellm-leds)を使っているのだが、Ubuntu 17.04でパッケージ “gkrellm-leds” をインストールしてもプラグインが表示されず、設定ダイアログ内のプラグイン一覧にもチェックボックスが表示されない、という問題が起こった。

この対処に成功したので、問題点と対処方法についてをまとめておく。

  1. 問題点
  2. 既存のパッケージでの対処
  3. 自分でビルドする場合の対処
    1. リンク時のオプションの順番を修正する場合
    2. Clangを使用する場合

問題点

設定ダイアログの “プラグイン” にある “インストール・ログ” のタブを見ると

/usr/lib/gkrellm2/plugins/gkleds.so
 エラー: /usr/lib/gkrellm2/plugins/gkleds.so: undefined symbol: XTestFakeKeyEvent

プラグインを読み込もうとしてはいるようなのだが、 “libXtst” というライブラリが動的に読み込めていないためにプラグインの読み込みに失敗しているようだ。

$ ldd /path/to/gkleds.so
        linux-vdso.so.1 =>  (0x00007ffd7f94c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d7b0a2000)
        /lib64/ld-linux-x86-64.so.2 (0x00005624d756e000)

既存のパッケージでの対処

GKrellMの実行時、環境変数LD_PRELOADlibXtst.so.6のパス名を指定することで正しく動作する。起動の度に指定する必要があるが、ソースから自分でビルドする必要はない。

(x86_64版OSでの実行例)
$ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libXtst.so.6 gkrellm &

環境変数LD_PRELOADは、プログラム実行時に同環境変数に指定した共有オブジェクトファイル群(*.so, *.so.[数字])を他のどれよりも先に強制的に読み込ませるために用いられるもので、複数指定する場合はコロンやスペースで区切る(スペース区切りの場合は全体をクォートで囲む)。

自分でビルドする場合の対処

ビルドの際に対処を行う場合、環境変数LD_PRELOADを指定しなくても動作する。

リンク時のオプションの順番を修正する場合

[引用]ファイル名:gkrellm-leds-0.8.0/Makefile
gkleds.so : $(OBJS)
 $(CC) $(LFLAGS) $(LIBS) -o $@ $< 

となっている部分を

[一部]ファイル名:gkrellm-leds-0.8.0/Makefile
gkleds.so : $(OBJS)
 $(CC) $(LFLAGS) -o $@ $< $(LIBS)

と変更し、リンクするライブラリに関するオプション指定を末尾に移動してビルドしたプラグインを使用することで正しく動作するようになる。

Clangを使用する場合

コンパイラにClangを使用した場合、バージョン4.0系時点ではリンク時のオプションの順番を修正することなく動作している。

[gkrellm-leds-0.8.0]$ make CC=clang

もちろん、将来のバージョンでMakefileの書き換えが必要になる可能性はある。

使用したバージョン:
  • GCC 6.3.0
  • Clang 4.0.0
  • GKrellM 2.3.10
  • gkrellm-leds 0.8.0