概要
FreeBSD 13.5R環境で devel/pcsc-lite を 2.3.1,2 から 2.3.3_1,2 に更新したところ、PC/SC を使うクライアントである multimedia/ab25 の b25 コマンドが失敗するようになった。
% b25 src.ts dst.ts error - failed on B_CAS_CARD::init() : code=-3
原因
gdb 等で調べたところ、pcsc-lite そのものというより、b25 実行時に pthread(libthr)がプロセスにロードされていないことが原因だった。
2.3.1 の頃は環境要因で偶然 libthr がロードされており問題が見えなかったが、2.3.3 ではライブラリ構成やロードのされ方の変化で顕在化した可能性が高い。
対策
正攻法は ab25 を pthread 付きでビルドすること。簡易的には LD_PRELOAD=/lib/libthr.so.3 を付けて起動すると回避できる。
% env LD_PRELOAD=/lib/libthr.so.3 b25 src.ts dst.ts
運用上は b25 のラッパーを用意して呼び出し元を差し替えるのが楽だったので、この方法にした。
% sudo tee /usr/local/bin/b25_wrapper >/dev/null <<'EOF'
#!/bin/sh
REAL_B25="$(dirname "$0")/b25"
if [ ! -x "$REAL_B25" ]; then
echo "b25_wrapper: real b25 not found or not executable: $REAL_B25" >&2
exit 127
fi
case ":${LD_PRELOAD:-}:" in
*:/lib/libthr.so.3:*) : ;;
*)
if [ -n "${LD_PRELOAD:-}" ]; then
export LD_PRELOAD="/lib/libthr.so.3:${LD_PRELOAD}"
else
export LD_PRELOAD="/lib/libthr.so.3"
fi
;;
esac
exec "$REAL_B25" "$@"
EOF
% sudo chmod 755 /usr/local/bin/b25_wrapper
/usr/local/bin/b25_wrapper ができるので、b25 を呼び出している部分を b25_wrapper に変更すればOK。
注: 本記事はFreeBSD上のライブラリ依存関係の不具合と回避策についての情報であり、利用にあたっては各自の契約・権利・法令に従ってください。