讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ LLVM ORC JIT 怎么安全管理动态生成的函数符号与内存释放

陌伟君_5046

陌伟君_5046

发布时间:2026-10-30 12:23:20

|

200人浏览过

|

来源于php中文网

原创

ORC JIT中符号隔离依赖JITDylib,默认不全局可见;每个JITDylib独立维护符号表,跨dylib调用需显式添加依赖,lookup必须指定目标dylib,内存由SectionMemoryManager自动管理。

c++ llvm orc jit 怎么安全管理动态生成的函数符号与内存释放

ORC JIT 中符号隔离靠 JITDylib,不是自动全局可见

默认情况下,orc::ExecutionSession 创建的每个 JITDylib 都是符号隔离的——你在 main dylib 里 addIRModule 注入的函数,其他 dylib 根本看不到。这不是 bug,是设计:避免符号污染和重复定义冲突。

常见错误现象:调用 ES.lookup("add") 返回 nullptr 或地址为 0,但 IR 没报错、dump() 显示函数存在。原因往往是 lookup 目标 dylib 错了,或没显式声明依赖。

  • 查符号必须指定目标 dylib:mainJD.lookup(Mangle("add")),不能只写 ES.lookup("add")
  • 跨 dylib 调用需手动添加依赖:otherJD.addDependentJITDylib(mainJD)
  • 若模块含外部 C 函数(如 printf),必须先用 absoluteSymbols 注册地址,再通过 DynamicLibrarySearchGenerator 暴露给 dylib

内存释放不靠手动 free,而靠 JITDylib 生命周期或 removeModule

ORC 不让你直接 mmap/mprotect 管理页,而是通过 SectionMemoryManager 统一分配可执行内存。释放时机由 JITDylib 控制:销毁 dylib 或调用 removeModule 时,它会自动回收对应内存页并取消 mprotect(PROT_EXEC)。

容易踩的坑:在 dylib 还活着时,把函数指针保存到全局变量并长期持有,然后误删 dylib —— 下次调用就 SIGSEGV。因为地址虽还在,但底层内存已被 unmap。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 安全做法:函数指针只在 dylib 存活期内使用;需长期持有时,改用 std::shared_ptr 包裹 JITDylib 引用
  • removeModule 是异步的,返回 orc::MaterializationUnit::Handle,可 await 完成后再释放相关资源
  • 不要对 JIT 生成的函数地址调用 free() 或 munmap() —— ORC 会自己处理,强行干预会导致 double-free 或段错误

符号名冲突与重复注入必须主动防御

同一 JITDylib 内两次 addIRModule 含同名全局函数(如都叫 add),默认触发“重复定义”错误,addIRModule 抛异常或返回失败状态。这不是链接器报错,是 ORC 在符号注册阶段就拦截了。

原因在于 ORC 默认关闭自动接管符号所有权(setAutoClaimResponsibilityForObjectSymbols(false)),所以遇到重名就拒绝。

  • 允许覆盖:创建 dylib 时调用 mainJD.setAutoClaimResponsibilityForObjectSymbols(true)
  • 更推荐做法:每次生成新模块时用唯一前缀命名函数,比如 "add_v2_1742",避免隐式覆盖逻辑
  • 调试时加 module->dump() 和 ES.dump(),确认符号是否已注册、是否被正确 mangled

RTTI/EH 必须开启,否则 SymbolResolver 构造失败静默崩溃

LLVM 14+ 的 ORCv2(尤其是 orc::KaleidoscopeJIT 及其派生类)严重依赖 RTTI 做类型擦除和动态 dispatch。若 CMake 中未设 LLVM_ENABLE_RTTI=ON,orc::SymbolResolver 构造可能成功,但后续 lookup 时在虚函数调用点 SIGSEGV,且无明确错误信息。

同样,未启用异常处理(LLVM_ENABLE_EH=ON)会导致 ExecutionSession 内部异常传播中断,错误被吞掉,表现为 JIT 无响应或随机挂起。

  • 检查方法:编译时加 -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON,链接时确保 llvm-orc 和 llvm-executionengine 在依赖链中
  • 运行时验证:在 addIRModule 后立即 ES.lookup 一个已知函数,捕获 std::exception 并打印 .what()
  • 不要依赖 llvm-config --cxxflags 的默认输出 —— 它不包含 RTTI/EH 开关,必须显式传给 CMake

最易忽略的一点:符号解析失败和内存释放不匹配往往同时发生,但错误表现却像纯内存问题。实际 debug 时,应先确认 JITDylib 的生命周期管理是否与函数指针使用范围对齐,再查符号注册路径,最后碰内存权限——顺序反了,90% 的时间会浪费在 mprotect 调试上。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2268

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C语言中文开发手册
C语言中文开发手册

共0课时 | 0.2万人学习

极客学院ASP.NET视频教程
极客学院ASP.NET视频教程

共90课时 | 24.5万人学习

Go语言教程手册
Go语言教程手册

共23课时 | 27.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn