From 2411ceff8c5a8339938da7b8be9947f880c563ea Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 24 Oct 2026 23:15:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(ffilib):=20=E6=8A=8A=20=5Fffilib=20?= =?UTF-8?q?=E6=8B=89=E8=BF=9B=E4=BE=9D=E8=B5=96=E9=97=AD=E5=8C=85=EF=BC=88?= =?UTF-8?q?Pass=200=20pending=20+=20import=20=E7=99=BD=E5=90=8D=E5=8D=95?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit thunk 生成时报 module _ffilib 未在 includes 扫描中:includes 是按需可达性扫描,没有任何文件 import _ffilib 就不会收录它。Pass 0 的 import 处理里对 ffilib 追加 pending(_ffilib);_check_import_sha1 也放行 _ffilib(防止显式 import 时报无 SHA1)。若可达性仍不生效,改用方案 B:thunk 直接调 LoadLibraryA/GetProcAddress(裸名、无需模块 SHA1),去掉对 _ffilib 的依赖。 --- App/lib/core/Gen/ImportsGenMixin.vp | 3 +++ App/lib/core/builtin/ViperBuild.vp | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/App/lib/core/Gen/ImportsGenMixin.vp b/App/lib/core/Gen/ImportsGenMixin.vp index 9a08989..64a7260 100644 --- a/App/lib/core/Gen/ImportsGenMixin.vp +++ b/App/lib/core/Gen/ImportsGenMixin.vp @@ -556,6 +556,9 @@ novirtual class ImportsGenMixin: if string.strcmp(mod_name, "ctraits") == 0: return 1 if string.strcmp(mod_name, "viperbuild") == 0: return 1 if string.strcmp(mod_name, "ffilib") == 0: return 1 + # runtime CDLL 的 thunk 会调用 _ffilib(真实运行时库),把它登记为已导入模块, + # 让按需可达性扫描收录它并分配 SHA1(否则 thunk 生成时报 module not found)。 + if string.strcmp(mod_name, "_ffilib") == 0: return 1 mod_sha1: str = StubMergerStore.LookupSha1ByModName(mod_name) if mod_sha1 is None: # App sibling exemption: a {mod_name}.vp/.py exists next to the current file diff --git a/App/lib/core/builtin/ViperBuild.vp b/App/lib/core/builtin/ViperBuild.vp index 1953980..fd9186c 100644 --- a/App/lib/core/builtin/ViperBuild.vp +++ b/App/lib/core/builtin/ViperBuild.vp @@ -10,6 +10,7 @@ import lib.Projectrans.Utils as Utils import lib.Projectrans.Config as Config import lib.core.VLogger as VLogger import lib.core.IncludesScanner as IncludesScanner +import stdio # kernel32!GetEnvironmentVariableA (DWORD(LPCSTR, LPSTR, DWORD)) - declared here, same as includes/traceback.vp; # win32base.vp omits it but kernel32 is linked anyway; only for selfmachine host detection. @@ -465,6 +466,9 @@ def _HandleImport(stmt: ast.Import*) -> int: # 宏库:不参与 BFS,只记别名(CDLL 语句由 _HandleCDLL 抽取) if al.asname is not None: _ffi_alias = _DupScratch(al.asname) else: _ffi_alias = _DupScratch("ffilib") + # runtime CDLL 的 thunk 要调 _ffilib(真实运行时库):显式加入闭包, + # 否则按需可达性扫描不会收录它,_resolve_module_sha1("_ffilib") 会返回 None。 + _AddPending("_ffilib") else: _AddPending(al.name) return 0