LD_PRELOAD を使い WSL2 と X410 を接続する。

TLDR

次のように実行時環境変数 LD_PRELOAD を変更する。これによりシステムの shared object file を置き換えずに VSOCK 対応の XCB library を利用する。

1
LD_PRELOAD="$HOME/lib/libxcb-1.14-vsock-x64/libxcb.so.1.1.0" DISPLAY="vsock/:0" emacs

なお HOME/lib/libxcb-1.14-vsock-x64/libxcb.so.1.1.0https://gitlab.com/vsockfy/libxcb-1.14-vsock/-/releases/v1.14-vsock のVSOCK 対応 XCB ライブラリを展開したもの。

TCP と VSOCK

WSL2 と X410 を接続する方法は TCP と VSOCK がある。

TCP は特別な準備なし使えるため手軽である。しかし、TCP/IP に問題が発生すると WSL2 の GUI アプリケーションも影響を受けてしまう。例えば、ノートPC の WIFI 接続が切れると、WSL2 の GUI アプリケーションが終了してしまう。

VSOCK は仮想マシンとホスト間で通信するためのアドレスファミリ。VMware, KVM, Hyper-V に対応している。TCP/IP に依存しないため上記のような問題はない。一方で VSOCK を使うための準備が必要である。

VSOCK 利用のための準備

公式サイト https://x410.dev/cookbook/wsl/using-x410-with-wsl2/ に2つの方法が紹介されている。コマンド socat をバックグランドで実行する方法と X protocol C-language Binding (XCB) ライブラリに手を加える方法である。公式サイトではシステムの XCB ライブラリの shared object libxcb.so.1.1.0 を置き換える手順を紹介している(https://x410.dev/cookbook/transparently-adding-native-support-for-vsock-in-x11-apps/)。

バックグラウンドでプログラムを実行するのは面倒である(二重起動の防止や死活監視など)。 一方、システムのパッケージマネージャに管理されている shared object を置き換えるのも、できれば避けたい。

この問題は LD_PRELOAD を使い参照されるライブラリを上書きすることで解決できる。具体的な方法は冒頭に記載した通りである。