diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index f557709..6b12c7c 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -2354,6 +2354,19 @@ class Phase2Translator: and os.path.basename(src_path) in _TRACEBACK_MODULE_FILES) if _traceback_ctor: trans.translator.TracebackCtor = True + # --traceback:记录 traceback.Install 的跨模块符号名,含 main 的模块在入口 + # 直接调用它(不依赖 .ctors/.init_array,避免 MinGW 下 .ctors.65534 不执行)。 + if self.traceback_enabled: + _tb_sha1: str | None = None + for _src_map in (getattr(self, '_shared_source_module_sig_files', {}), self.sig_files): + for _k, _p in _src_map.items(): + if 'traceback' in os.path.basename(_p): + _tb_sha1 = _k + break + if _tb_sha1: + break + if _tb_sha1 is not None: + trans.translator.TracebackInstallSymbol = f'{_tb_sha1}.Install' trans.SliceLevel = self.slice_level trans.translator.SliceLevel = self.slice_level trans.translator.SliceCount = 0 diff --git a/lib/core/Handles/HandlesFunctions.py b/lib/core/Handles/HandlesFunctions.py index 971917e..fd4bcb2 100644 --- a/lib/core/Handles/HandlesFunctions.py +++ b/lib/core/Handles/HandlesFunctions.py @@ -2054,6 +2054,13 @@ class FunctionHandle(BaseHandle): func_body = func_body[1:] else: Gen._create_doc_global(doc_symbol, None) + if Node.name == 'main': + _tb_install: str | None = getattr(self.Trans, 'TracebackInstallSymbol', None) + if _tb_install: + _install_fn = Gen._CreateOrReuseFuncDecl( + _tb_install, ir.FunctionType(ir.IntType(32), [])) + _entry_block = func.blocks[0] if func.blocks else func.append_basic_block('entry') + ir.IRBuilder(_entry_block).call(_install_fn, []) try: self.Trans.BodyHandler.HandleBodyLlvm(func_body) except Exception as _body_exc: