🥴
AlmaLinux で EDAツール が `libkrb5` 周りで落ちた件と、`LD_PRELOAD` で直した記録
TL;DR
- 症状:
dgcom_exec: symbol lookup error(Kerberos → さらに OpenSSL でも連鎖) - 原因:ツール同梱ライブラリとOS標準ライブラリが“混在”し、同じ系列のセットとして揃っていなかった
- 解決:
.cshrcで OS 側のlibk5crypto.so.3とlibcrypto.so.1.1をLD_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 解決後
❌ 問題が起きていたフロー
- ツール起動
-
.cshrc(設定なし)読み込み - 動的リンカがライブラリ解決
-
libkrb5.so.3→ OS版 -
libk5crypto.so.3→ ツール同梱版(混在)
-
- 実行時:
libkrb5がk5cryptoに要求するシンボルが 見つからず エラー
✅ 解決後のフロー
- ツール起動
-
.cshrcでLD_PRELOAD設定を適用- OS版
libk5crypto.so.3とlibcrypto.so.1.1を先にロード
- OS版
- 動的リンカがライブラリ解決
-
libkrb5.so.3・libk5crypto.so.3・libcrypto.so.1.1→ 全部 OS 版で統一
-
- 実行時:同系列のセットとして噛み合い、正常起動
検証に使ったコマンド(抜粋)
# どれを掴んだか(静的)
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.3とlibk5crypto.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_PRELOADで OS 版の k5crypto と OpenSSL を先読みさせ、同じ系列の束に統一することで解決。 - 調査は
ldd/LD_DEBUG=libs/objdump -Tが基本三種の神器。
Discussion