基于EDK2开发UEFI应用时,如何合规使用LGPL-3.0许可的动态链接库?
EDK2开发UEFI应用:LGPL-3.0动态链接库的合规使用与实现
一、LGPL-3.0合规性确认
先明确你方场景的合规边界,只要满足以下要求,闭源UEFI应用动态链接该库是符合LGPL-3.0许可的:
- 采用动态链接而非静态链接的方式调用库;
- 公开该库的完整源码(包括你方修改的部分),并提供给用户获取途径;
- 允许用户自行替换该库的修改版/新版本,且你的应用能兼容运行;
- 在应用的文档中明确声明使用了该LGPL-3.0许可的库,并说明源码获取方式。
二、UEFI环境下动态链接库的实现步骤
1. 将LGPL-3.0库编译为UEFI兼容的动态模块
- 适配库的源码到UEFI环境:替换标准C库的调用(如
malloc/printf)为UEFI Boot Services提供的对应函数(如AllocatePool/Print); - 基于EDK2工具链编译:创建EDK2 INF文件,设置
MODULE_TYPE = DXE_DRIVER(或根据库的运行时需求选择DXE_RUNTIME_DRIVER),并配置LIBRARY_CLASS导出库的核心接口; - 编译生成独立的
.efi格式模块文件,该文件即为可被动态加载的UEFI共享库。
2. 闭源UEFI应用中调用动态库
- 加载库镜像:调用UEFI Boot Services的
LoadImage函数,将库的.efi文件加载到内存,得到对应的Image Handle; - 初始化库:通过
StartImage函数启动库模块,完成库的初始化流程(若库无需初始化可跳过); - 获取导出函数地址:解析库模块的PE格式导出表——可使用EDK2提供的
GetImageExportTable函数快速获取导出表,再根据函数名定位到对应的函数指针; - 调用库函数:通过获取到的函数指针直接调用库的功能;
- 卸载资源:当不再使用库时,调用
UnloadImage函数释放库占用的内存资源。
3. 合规性落地细节
- 随闭源应用一同提供该LGPL-3.0库的完整源码包(包含你方修改的所有内容);
- 在应用的说明文档(如README、关于页面)中添加许可声明,明确标注库的名称、许可类型,并告知用户如何替换库以验证兼容性;
- 确保应用未对库的调用做硬编码锁定,用户自行编译的修改版库可直接替换原模块并正常运行。
内容的提问来源于stack exchange,提问作者user212942
相关产品推荐
相关产品推荐

