From 67aff30c33d42f8baf7838a3487bd6454ee86e04 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Aug 2026 17:21:02 +0000 Subject: [PATCH] =?UTF-8?q?fix(CRITICAL):=20=E5=8E=BB=E6=8E=89Phase3?= =?UTF-8?q?=E9=80=92=E5=BD=92=E5=8A=A0=E8=BD=BD=E6=89=80=E6=9C=89.so?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=9F=90=E4=B8=AA=E6=9C=AA=E7=9F=A5.so?= =?UTF-8?q?=E5=AF=BC=E8=87=B4segfault?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 诊断确认:单独加载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。 --- ex_engine/python/ix_unified.py | 43 ++++++++++++---------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/ex_engine/python/ix_unified.py b/ex_engine/python/ix_unified.py index bee35559..50f87a61 100644 --- a/ex_engine/python/ix_unified.py +++ b/ex_engine/python/ix_unified.py @@ -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