FreeBSDでpcsc-liteを2.3.3に更新するとab25(b25)が失敗する(libthr未ロード)

概要

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上のライブラリ依存関係の不具合と回避策についての情報であり、利用にあたっては各自の契約・権利・法令に従ってください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です