radare2 许可证指南:LGPL 合规使用、插件许可与 GPL 代码裁剪
【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2
导读
本文是 radare2 仓库官方许可证文档(doc/licenses.md)的深度解读与实践指南,面向计划将 r2 静态链接进自有产品、通过 r2pipe 集成脚本、或需要分发带 GPL 插件的构建包的开发者。读完本文你将掌握:LGPLv3 对静态链接与动态调用的法律边界、-Lj命令与 scripts/licenses.r2.js 脚本排查插件许可的实操方法、以及通过--without-gpl/nogpl选项裁剪 GPL 代码的完整流程。
r2 的许可证总体策略:LGPL 为主体
radare2 主程序与核心库采用LGPL(GNU Lesser General Public License)许可证体系。在动手将 r2 静态链接进自己的二进制之前,必须先弄清楚 LGPL 与 GPL、以及静态链接(static linking)与动态链接(dynamic linking)之间的法律差异。官方文档指出:LGPLv3 保留了用户"切换到不同版本 r2 库"的自由——即除非私有软件在分发时一并提供完成完整静态链接所需的全部目标文件(object files),否则不允许直接静态链接。这样做的目的是保证最终用户有能力升级或修改随产品分发的 r2 库。
具体规则可以概括为:
- r2 采用 LGPL 许可,它允许静态链接,但强制要求你同时"解放"目标文件,并提供让用户能够自行链接它们的途径;
- 如果只是通过 r2pipe、脚本或插件调用 r2,不产生任何法律问题——前提是你没有修改 r2 本体;
- 如果你修改了 r2 以适配自己的工具,那么这些改动必须公开,从而确保用户始终拥有更换或升级随 r2 一起分发的库的自由。
文档还特别提醒:如果你的商业闭源产品要使用 r2,务必构建时剔除可能"感染"你程序的那些部分,并建议参考 FSF 或 GNU 的官方材料来理解许可证的具体运作机制。
静态链接、动态调用与 r2pipe 的边界
官方文档用两个关键场景划清了合规边界:
- 静态链接(static linking):LGPL 允许,但附带严格条件——必须随私有软件分发完整静态链接所需的目标文件,让用户能够替换或升级 r2 库后自行重新链接。这条规则直指 LGPLv3 的核心精神:保持用户"切换到不同版本 r2 库"的自由,防止把 LGPL 库固化为私有软件不可分割的一部分。
- 通过 r2pipe / WebUI 的文本接口集成:只要集成方式是文本化接口,不需要对 r2 做逆向工程或库级链接,其他程序就不会受许可证规则影响。这意味着通过 r2pipe(管道通信)、WebUI(HTTP 接口)等进程间通信方式调用 r2 的闭源程序,天然处于合规地带。
从源码结构看,这一设计是有意为之:r2pipe 走的是 stdin/stdout 管道协议(binr/r2pipe 目录下没有独立库依赖),WebUI 则由 shlr/www 下的独立资源目录提供,两者都不与 r2 库发生链接关系,因此不会把闭源代码"感染"进 LGPL 体系。
用-L命令在运行时排查插件许可证
命令行-L/-Lj输出
radare2 的所有插件(如汇编、反汇编、分析、调试、二进制加载插件)都在定义结构中显式暴露许可证信息。例如一个典型的插件声明(参见 libr/anal/p/anal_null.c 等众多插件源文件):
RAsmPlugin r_asm_plugin_dummy = { ... .license = "LGPL3", ... };.license字段是插件定义结构体的标准成员,绝大多数插件都以这种方式标注自己的许可证。该信息可以通过任意 r2 程序(radare2、rabin2、rasm2、rahash2、rafind2、ragg2、r2agent 等)的命令行-L标志在运行时读取。以r2 -L为例,libr/main/radare2.c 中case 'L'分支会设置插件列表标志,后续以 JSON 形式(-Lj)输出全部插件及其许可证。
实践中最常用的检查命令是把输出交给jq聚合去重,快速了解当前构建里究竟混入了哪些许可证:
$ r2 -Lj | jq -r '.[].license' | sort -u BSD GPL3 LGPL LGPL3 MIT同样的方法适用于其他工具,例如rabin2 -L、rasm2 -L(libr/main/rasm2.c)、rahash2 -L(libr/main/rahash2.c)等,所有-L分支的语义一致。
scripts/licenses.r2.js自动化审计脚本
官方文档推荐使用 scripts/licenses.r2.js 来检查当前 r2 构建使用的全部许可证,并同步更新doc/licenses目录。该脚本以#!/usr/bin/env -S r2 -j直接作为 r2 脚本运行,工作流程如下:
- 内置一份许可证别名映射表,把插件中常见缩写归一化为 SPDX 标识符,例如
LGPLv3/LGPL3→LGPL-3.0-only、LGPL/LGPL2→LGPL-2.0-only、GPL/GPL2→GPL-2.0-only、BSD/BSD-3→BSD-3-Clause、Apache→Apache-2.0,并在发生别名转换时打印黄色的ALIASED提示; - 先检查本地 doc/licenses 目录下是否已有对应
<SPDX>.txt许可证全文(如LGPL-3.0-only.txt、GPL-3.0-only.txt、MIT.txt等,这些正是 doc/licenses 目录中实际存放的许可证文本文件);没有则通过curl从 spdx.org 拉取,并落盘缓存到doc/licenses/; - 通过
r2 -Vj读取当前构建的第三方库(thirdparty)与各插件(plugins)的许可证元数据,逐项输出模块名 许可证 OK/ERROR审计结果。
因此,在发布一个定制构建前,跑一遍该脚本就能拿到完整的许可证清单与缺失文本告警。
插件许可证的源码佐证
插件级许可证信息在源码中随处可见,以分析(anal)插件为例,libr/anal/p/anal_a2f.c、libr/anal/p/anal_autoname.c、libr/anal/p/anal_six.c、libr/anal/p/anal_tcc.c 等文件中的插件定义结构体都包含.license字段;架构(arch)插件如 libr/arch/p/6502/plugin.c、libr/arch/p/8051/plugin.c 同样如此。这一点可以从-Lj输出中直接验证——每个插件条目都携带license字段,与源码声明一一对应。
需要特别留意的是,插件许可证与主程序 LGPL 并不总是一致:部分插件标注为 GPL、BSD 或 MIT,其中 GPL 插件正是下文"裁剪"章节的处理对象。
非 LGPL 代码清单:分门别类
官方文档明确指出,r2 中有若干部分不属于 LGPL,分为两类:
比 LGPL 更严格:GPL
GPL 插件可以在编译期被剔除(opt-out),适用于担心 GPL "感染"闭源产品的场景。官方文档同时给出了两类构建系统的对应开关:
- acr/make 构建系统:
$ ./configure --without-gpl--without-gpl选项在 configure 中被定义为"do not build GPL code (grub, cxx, ...)"(configure 的用法说明,以及 configure 的WITH_GPL="0"赋值),即跳过 grub 文件系统插件、C++ demangler 等 GPL 部件。
- meson 构建系统:
$ meson -D nogpl=truenogpl是 meson 的布尔选项,定义于 meson_options.txt(option('nogpl', type: 'boolean', value: false)),并由 meson.build 及 libr/bin/meson.build、libr/fs/meson.build 等子模块的构建逻辑消费。
官方特别注明:两种构建系统在不传任何选项时的默认行为完全一致。
若想精确控制插件集合,dist/plugins-cfg/plugins.nogpl.cfg 提供了一份安全(非 GPL)插件清单(共 135 行),覆盖arch.*、anal.*、bin.*、bp.*、core.*、muta.*、debug.*、egg.exec等各类插件。使用方法是先把它复制为./plugins.cfg,再调用./configure-plugins使其生效:
$ cp dist/plugins-cfg/plugins.nogpl.cfg ./plugins.cfg $ ./configure-plugins注意:plugins.nogpl.cfg是相对精简的白名单,仅包含确定安全的插件(例如arch.x86_nz、bin.elf、debug.native等基础插件),并不等同于完整功能集;按此配置构建出的 r2 会缺少 GPL 插件对应的能力。同目录下还提供plugins.static.nogpl.cfg、plugins.tiny.cfg等衍生配置,以及dist/jslinux/Makefile、dist/uefi/Makefile、sys/static.sh、sys/tiny.sh、sys/wasm.sh等脚本中对--without-gpl的组合使用,可作参考。
比 LGPL 更宽松:Permissive 许可证
以下组件采用比 LGPL 更宽松的许可(官方清单,附仓库内对应路径):
| 组件 | 路径 | 许可证 |
|---|---|---|
| C++ 反混淆器 | libr/bin/mangling/cxx | GPLv2 或更高版本,带链接例外 |
| sdb 数据库 | subprojects/sdb | MIT |
| capstone 反汇编引擎 | subprojects/capstone | BSD + LLVM |
| zip 库 | shlr/zip/zip | BSD |
| zlib | shlr/zip/zlib | BSD |
| java 支持 | shlr/java | Apache 2.0 |
| qnx 调试支持 | shlr/qnx | GPL(文档注明将很快移入 extras) |
| grub 文件系统插件 | libr/fs/p/grub | GPL(供 fs 插件使用) |
| lz4 压缩 | shlr/lz4 | 简化 BSD |
特别说明:libr/bin/mangling/cxx虽然是 GPLv2-or-later,但带有链接例外(linking exception),意味着与它链接的程序不会被 GPL 传染——这也是"比 LGPL 更宽松"的典型例子。而shlr/qnx与libr/fs/p/grub两处则是纯 GPL,属于编译期裁剪的对象。
shlr/ 其余代码遵循 LGPL
shlr/(shared libraries,r2 内置的一组第三方/自研子库)中其余组件保持 LGPL:
- shlr/winkd:LGPL(Windows 内核调试协议)
- shlr/bochs:LGPL(Bochs 调试协议)
- shlr/tcc:LGPL(TinyCC 子集编译器)
- shlr/spp:LGPL(文档注明可能改为 MIT 或 BSD)
- shlr/gdb:LGPL(GDB 远程调试协议)
闭源产品集成清单与 FAQ
结合官方文档与源码,在闭源/私有产品中使用 r2 时建议遵循以下检查清单:
- 进程级集成优先:能通过 r2pipe 管道、WebUI 文本接口或 r2 命令行交互完成的,就不要链接 r2 库——文本接口路径下其他程序不受许可证规则影响;
- 确需链接时评估链接方式:动态链接最为稳妥;静态链接必须随产品分发完整目标文件,并保证用户能自行重链接、升级 r2 库;
- 修改必须回馈:任何为适配自有工具而修改 r2 的部分,都要公开,以维护用户替换/升级 r2 库的自由;
- 编译期裁剪:使用
./configure --without-gpl(acr/make)或meson -D nogpl=true(meson)剔除 GPL 插件;如需精确控制,将 dist/plugins-cfg/plugins.nogpl.cfg 复制为./plugins.cfg后运行./configure-plugins; - 发布前审计:运行
r2 -Lj | jq -r '.[].license' | sort -u快速盘点许可证集合,或用 scripts/licenses.r2.js 生成完整审计报告并同步 doc/licenses 目录; - 不确定时咨询专业人士:官方文档明确建议,遇到构建、链接、分发相关的许可证疑问,可联系 r2 作者(pancake@nopcode.org)或直接咨询自由软件基金会(FSF)。
常见误区澄清:
- "LGPL 不允许静态链接"——不准确。LGPL允许静态链接,但强制要求分发目标文件并提供重链接途径;
- "r2pipe 集成也需要开源"——不需要。文本接口集成(r2pipe/WebUI)不产生链接关系,闭源程序可正常使用;
- "GPL 插件可以不管"——不行。GPL 插件会"感染"静态链接你的程序的代码,必须用
--without-gpl/nogpl裁剪或改用白名单配置。
结语
radare2 的许可证体系以 LGPL 为核心、以插件级.license字段为透明化手段、以构建期裁剪选项为合规兜底:主库 LGPL 兼顾自由与商用,permissive 组件(MIT/BSD/Apache)进一步降低集成成本,GPL 插件则可通过--without-gpl/meson -D nogpl=true一键剔除。配合-Lj运行时审计与 scripts/licenses.r2.js 自动化核查,开发者完全可以在不触碰法律红线的前提下,把 r2 的能力安全地嵌入自有工具链。
【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考