🥴

AlmaLinux で EDAツール が `libkrb5` 周りで落ちた件と、`LD_PRELOAD` で直した記録

に公開

TL;DR

  • 症状:dgcom_exec: symbol lookup error(Kerberos → さらに OpenSSL でも連鎖)
  • 原因:ツール同梱ライブラリOS標準ライブラリが“混在”し、同じ系列のセットとして揃っていなかった
  • 解決:.cshrcOS 側の libk5crypto.so.3libcrypto.so.1.1LD_PRELOAD で先読みさせ、セットを統一

環境

  • OS:AlmaLinux 8.9
  • ツール:EDAツール
  • シェル:csh

症状(最初のエラー)

ツール起動時に以下で停止。

/tools/fusioncompiler/.../dgcom_exec: symbol lookup error: /lib64/libkrb5.so.3:
undefined symbol: krb5int_c_deprecated_enctype, version k5crypto_3_MIT

ひとこと解説
libkrb5.so.3(Kerberos 本体)が、“相方”の libk5crypto.so.3 にあるはずのシンボルを探したが見つからず死亡。
つまり libkrb5 と libk5crypto が“同じセット”で揃っていない


調査ログ

どのライブラリを掴んでいるか

ldd /tools/fusioncompiler/W-2024.09-SP3/linux64/nwtn/bin/dgcom_exec | egrep 'krb5|k5crypto|com_err|krb5support'
# 要点
# libk5crypto.so.3 => /tools/.../shlib/libk5crypto.so.3   ← ツール同梱
# libkrb5.so.3     => /lib64/libkrb5.so.3                  ← OS標準

“後輪(k5crypto)はツール版、前輪(krb5)はOS版” の混在が確定。

シンボルの有無を確認

objdump -T /lib64/libk5crypto.so.3 | grep krb5int_c_deprecated_enctype
# OS版の k5crypto にはシンボル有り

しかし 実際にロードされているのはツール同梱の k5crypto。そこにそのシンボルが無く、未定義エラーに。


一度直そうとして起きた“第2のエラー”

LD_PRELOAD に OS の libk5crypto.so.3 を入れて進めたところ、今度は OpenSSL で停止:

...: symbol lookup error: /lib64/libk5crypto.so.3:
undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b

k5crypto(OS版)OpenSSL(libcrypto:ツール/旧版) の“別メーカー混在”に発展。


決定打:OS版の「束」で統一する

.cshrc(Cシェル)に追記した内容

# ~/.cshrc
# k5crypto と libcrypto を OS 側で強制プリロード
if ( $?LD_PRELOAD ) then
    setenv LD_PRELOAD "/lib64/libk5crypto.so.3 /lib64/libcrypto.so.1.1 $LD_PRELOAD"
else
    setenv LD_PRELOAD "/lib64/libk5crypto.so.3 /lib64/libcrypto.so.1.1"
endif

これで Kerberos(libkrb5, libk5crypto)OpenSSL(libcrypto)すべて OS 版で統一され、正常起動。
(必要なら libssl.so.1.1 も追加可:... /lib64/libssl.so.1.1 ...


フローで見る:問題時 vs 解決後

❌ 問題が起きていたフロー

  1. ツール起動
  2. .cshrc(設定なし)読み込み
  3. 動的リンカがライブラリ解決
    • libkrb5.so.3 → OS版
    • libk5crypto.so.3 → ツール同梱版(混在
  4. 実行時:libkrb5k5crypto に要求するシンボルが 見つからず エラー

✅ 解決後のフロー

  1. ツール起動
  2. .cshrcLD_PRELOAD 設定を適用
    • OS版 libk5crypto.so.3libcrypto.so.1.1 を先にロード
  3. 動的リンカがライブラリ解決
    • libkrb5.so.3libk5crypto.so.3libcrypto.so.1.1全部 OS 版で統一
  4. 実行時:同系列のセットとして噛み合い、正常起動

検証に使ったコマンド(抜粋)

# どれを掴んだか(静的)
ldd /tools/fusioncompiler/W-2024.09-SP3/linux64/nwtn/bin/dgcom_exec | egrep 'krb5|k5crypto|crypto|ssl'

# 実行時の解決ログ(動的)
LD_DEBUG=libs fc_shell -gui 2>&1 | egrep 'krb5|k5crypto|crypto|ssl' | head -n 50

# シンボルの有無
objdump -T /lib64/libk5crypto.so.3 | grep krb5int_c_deprecated_enctype

注意点・学び

  • “同じ束でそろえる”が鉄則
    libkrb5.so.3libk5crypto.so.3、さらに必要に応じて libcrypto.so.1.1 / libssl.so.1.1同じ系列(同じビルド世代)で揃える。
  • LD_PRELOAD の影響範囲
    そのシェルから起動する すべてのプロセスに影響。限定したい場合は 起動ラッパースクリプトでツール起動時だけセットするのが安全。
  • 32bit 混在は外す
    krb5-libs.i686 など 32bit の混在が予期せぬ解決に繋がることがある。不要なら外す:
    sudo dnf remove krb5-libs.i686 -y
    

まとめ

  • 原因は ツール同梱ライブラリと OS 標準ライブラリの“混在” による 未定義シンボル
  • LD_PRELOADOS 版の k5crypto と OpenSSL を先読みさせ、同じ系列の束に統一することで解決。
  • 調査は ldd / LD_DEBUG=libs / objdump -T が基本三種の神器。

Discussion