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