fix(CRITICAL): 去掉Phase3递归加载所有.so——某个未知.so导致segfault

诊断确认:单独加载torch libs + libixformer.so + _ixformer_torch.so
全部OK。但ix_unified.py的Phase 3递归glob加载ixformer子目录的
所有.so时,某个.so在RTLD_GLOBAL模式下导致C层segfault。

修复:只加载已验证安全的两个文件(libixformer.so和_ixformer_torch.so),
不再遍历/usr/local/corex/lib64下的所有lib*.so和子目录.so。
This commit is contained in:
Claude
2026-08-11 17:21:02 +00:00
parent 6425a96728
commit 67aff30c33

View File

@@ -35,7 +35,7 @@ def _load_bridge():
# resolved at runtime. Python default import uses RTLD_LOCAL, so we must
# force RTLD_GLOBAL on the ixformer .so files BEFORE loading our bridge.
try:
import ctypes, glob as _glob
import ctypes
# Phase 0: Load torch core libs first — ixformer depends on libc10.so etc.
try:
@@ -52,33 +52,20 @@ def _load_bridge():
except ImportError:
pass
for _base in ["/usr/local/corex/lib64/python3/dist-packages/ixformer",
"/usr/local/corex/lib/python3/dist-packages/ixformer",
"/usr/local/corex/lib64"]:
if not os.path.isdir(_base):
continue
# Phase 1: lib*.so (libixformer.so, libixattn.so — dependencies first)
for _so in sorted(_glob.glob(os.path.join(_base, "lib*.so*"))):
try:
ctypes.CDLL(_so, mode=ctypes.RTLD_GLOBAL)
except Exception:
pass
# Phase 2: _ixformer_torch*.so (contains ixformer::infer::* symbols)
for _so in sorted(_glob.glob(os.path.join(_base, "_ixformer_torch*.so"))):
try:
ctypes.CDLL(_so, mode=ctypes.RTLD_GLOBAL)
logger.info("Preloaded ixformer: %s", _so)
except Exception:
pass
# Phase 3: any remaining .so in subdirs
for _so in sorted(_glob.glob(os.path.join(_base, "**/*.so"), recursive=True)):
bn = os.path.basename(_so)
if bn.startswith("lib") or "_ixformer" in bn:
continue
try:
ctypes.CDLL(_so, mode=ctypes.RTLD_GLOBAL)
except Exception:
pass
# Phase 1: libixformer.so (CUDA kernels)
# Phase 2: _ixformer_torch.so (torch extension with ixformer_torch_ext::*)
# ONLY these two — do NOT recursively load unknown .so (causes segfault)
_ixf_base = "/usr/local/corex/lib64/python3/dist-packages/ixformer"
if os.path.isdir(_ixf_base):
for _name in ["libixformer.so",
"_ixformer_torch.cpython-310-x86_64-linux-gnu.so"]:
_p = os.path.join(_ixf_base, _name)
if os.path.isfile(_p):
try:
ctypes.CDLL(_p, mode=ctypes.RTLD_GLOBAL)
logger.info("Preloaded: %s", _name)
except Exception:
pass
except Exception:
pass