radare2 libr 架构解析:一张图看懂核心库 API 依赖关系

发布时间:2026/9/20 17:26:26

radare2 libr 架构解析:一张图看懂核心库 API 依赖关系 逆向工程网络安全【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址https://gitcode.com/gh_mirrors/ra/radare2点击查看免费下载导读radare2 的功能被拆分为多个以r_前缀命名的核心库libr/下的 libr_*它们之间的依赖关系决定了整个框架的构建顺序、插件机制与扩展方式。doc/rgraph.md 用一张 ASCII 关系图勾勒出这些 libr API 的相互依赖骨架。本文以该图为纲结合仓库中的构建脚本libr/libs.mk、libr/Makefile、libr/rules.mk与依赖分析工具libr/depgraph.pl、libr/symgraph.pl逐层拆解 core、io、anal、debug、flag 等模块的职责边界与真实调用关系读完你将对 radare2 的分层 插件架构形成完整认知并能自行验证任意模块之间的依赖。一、关系图总览doc/rgraph.md的开篇即给出如下架构图原文内容完整保留-------- .-| config | / -------- ------ ------ ------ ------ | core |--| cons | | asm | | diff | ------ | line | | bin | | sign | | \ ------ | anal | | hash | ,_____. ---- \ ---.-- --.--- ._____. | io | -------------------/ | | ---- | cmd, search, print |------| flags | | ------.-------------\ | meta | [ lib ] -------------- ------ ._____. | .----| debug, bp, vm | | lang | | | | reg, syscall | | macro | -------- | var, trace | ------- | plugins | --------------- | -----.--- | ---------------------------作者在原文中特别注明这是 Not-much-updated graph即一张更新频率不高的历史性关系图。但正因如此它恰好保留了 radare2 libr 层最稳定的架构骨架——图中几乎所有模块都能在当前仓库中找到对应目录且依赖方向与构建脚本高度吻合。下面逐层解读这张图。二、分层解读从中央枢纽到基础支撑1.core一切命令的中枢图中央是corelibr/core/它向上承载radare2主程序binr/radare2/radare2.c向下依赖几乎所有其他库。这一点在头文件中体现得最为直观libr/include/r_core.h 一口气包含了r_io.h、r_fs.h、r_egg.h、r_lang.h、r_asm.h、r_anal.h、r_cmd.h、r_cons.h、r_search.h、r_sign.h、r_debug.h、r_flag.h、r_config.h、r_bin.h、r_hash.h、r_util.h等头文件——这正是图中 core 向四方辐射出所有连线的原因。core 还通过libr/core/p/libr/core/p/提供核心插件core plugin并在 libr/core/cplugin.c 中完成注册其插件结构RCorePlugin定义在 r_core.h 中包含init/fini/call生命周期回调。2.io与plugins读写与扩展的基石图左侧显示iolibr/io/直接挂在core之下而io之下是[ lib ]与plugins。io负责一切底层输入输出抽象文件、内存、远端、调试接口等是上层分析的数据来源。libr/io/p/libr/io/p/目录中包含 66 个.c文件对应众多 io 插件文件、gdb、winkd、bochs、qnx 等它们正是图中plugins节点所指的插件体系底层还会链接shlr/shared libraries如 shlr/gdb/、shlr/java/、shlr/qnx/ 等libr/Makefile 在合并libr.so时会将../shlr/gdb/lib/libgdbr、libr_java、libr_shlr一并链接进来。3.config/cons配置与输出的基础层图上方是configlibr/config/右侧是conslibr/cons/与line。它们属于基础服务config提供全局配置项系统RConfig、回调机制见 libr/config/callback.ccons提供控制台输出、颜色、画布canvas、分页等交互能力图中把linelibr/cons/dietline.c、libr/cons/line.c单独列出因为它承担行编辑/提示符功能是 r2 交互体验的基础。4. 分析三件套asm/bin/anal图中core右侧第一组是asm、bin、anal这是 radare2 的分析核心三角asmlibr/asm/汇编/反汇编抽象依赖架构描述层archlibr/arch/并通过libr/asm/p/挂载 40 个左右的汇编插件bin二进制格式解析ELF/PE/Mach-O 等libr/include/r_bin.h 定义RBin相关接口anallibr/anal/代码分析函数、基本块、变量、类型、RTTI 等其R2DEPS在 libr/anal/Makefile 中声明为r_util r_reg r_syscall r_search r_cons r_flag r_arch r_esil r_io正好对应图中 anal 对 reg、syscall、esil、flag 等的依赖。三者共享的依赖同样可从 libr/asm/Makefile 看到r_syscall r_util r_esil r_muta r_flag r_cons r_reg r_arch。5. 语义层diff/sign/hash图中 asm/bin/anal 下方是diff、sign、hashdiff代码/二进制比对radiff2依赖 binr/radiff2/radiff2.csign签名系统核心命令z系列见 libr/core/cmd_zign.inc.c 与 libr/anal/sign.chash哈希算法rahash2依赖 binr/rahash2/rahash2.c。这三者常与flag命名地址/标签配合工作例如签名可以命中某个 flag 区域。6. 命令与检索cmd/search/print图中部偏下是cmd, search, print这组它们是 core 的左右手cmdlibr/core/cmd.c 及 libr/core/cmd_*.inc.c 系列解析并分发用户命令searchlibr/search/提供字节/字符串/正则搜索能力printlibr/util/r_print.h、libr/util/print.c负责格式化输出。7. 动态分析组debug/bp/vm/reg/syscall/var/trace图中左侧下方是debug, bp, vm与reg, syscall, var, trace的组合对应动态调试与运行时状态debuglibr/debug/与bplibr/bp/实现调试会话与断点db命令reglibr/reg/管理寄存器描述与读写syscalllibr/syscall/提供系统调用号与名称映射数据在libr/syscall/d/的.txt中var、trace属于 anal 与 debug 的产物函数局部变量、执行轨迹在图中的连线说明它们与调试/分析栈相互依赖。8. 脚本与宏lang/macro图右侧下方是langlibr/lang/与macrolang是语言插件层pipe、vala、dart 等见 libr/lang/ 中的.c与.valamacro对应命令宏(...)定义、.执行由 libr/core/cmd_macro.inc.c 实现图中 lang 指向 flags/meta 的虚线箭头表示脚本/宏执行结果最终会写回 flag 与 meta元数据。9. 数据底座flags/meta图右下角的,_____./._____.内是flags与meta它们是所有分析结果的命名空间与元数据落点flagslibr/flag/用RFlag维护地址↔名称映射并支持 flag 空间namespace与标签tags见 libr/flag/tags.cmeta记录注释、类型、字符串引用等元信息由 libr/anal/meta.c 与 libr/core/cmd_meta.inc.c 实现图中 cmd/search/print 与 flags/meta 之间的------双向箭头非常传神命令与检索既读 flag/meta又写 flag/meta。三、源码印证构建层级与真实依赖1. 构建顺序即依赖顺序libr/libs.mk 用LIBS0 ~ LIBS8定义了严格的构建层级这与关系图的依赖方向完全一致LIBS0util LIBS1socket reg cons bp config muta syscall LIBS2search flag esil io LIBS3arch fs LIBS4asm anal magic LIBS5lang egg bin LIBS6debug LIBS7core LIBS8main从下往上看util是唯一的基础随后是socket/reg/cons/bp/config/muta/syscall再上是search/flag/esil/io然后是架构层arch/fsasm/anal/magic位于第四层lang/egg/bin第五层debug第六层core第七层mainlibr/main/最顶层。每个模块在 libr/Makefile 中按$(LIBS0) ... $(LIBS8)顺序递归构建因此低层库绝不会反向依赖高层库。2. R2DEPS每个库显式声明的依赖每个模块目录的Makefile通过R2DEPS显式声明依赖例如libr/anal/Makefiler_util r_reg r_syscall r_search r_cons r_flag r_arch r_esil r_iolibr/asm/Makefiler_syscall r_util r_esil r_muta r_flag r_cons r_reg r_archlibr/arch/Makefiler_util r_reg r_esil r_muta这些声明同时用于生成 pkg-config 文件libr/rules.mk 的pkgcfg目标会把R2DEPS写入Requires:字段因此pkg-config用户也能看到真实的库依赖链。3. 合并库与符号导出构建系统最终把各libr_*.a合并为统一的libr.a/libr.solibr/Makefile并设置-fvisibilityhidden只导出r_*符号。这说明图中所有模块对外呈现为统一的r_API 命名空间符合以 core 为枢纽、其余模块各司其职的设计。四、验证工具如何自己画出并核对这张依赖图doc/rgraph.md没有解释图的生成方式但仓库提供了两套现成的验证脚本可以复现、更新这张关系图。1.depgraph.pl从 Makefile 生成依赖图libr/depgraph.pl 通过解析各模块Makefile中的DEPS/R2DEPS行生成图数据支持三种输出格式perl depgraph.pl -h # 查看用法 perl depgraph.pl dot # 输出 Graphviz dot 格式 perl depgraph.pl gml # 输出 GML 格式 perl depgraph.pl r2 # 输出 radare2 图命令 (agn/age/agg)脚本注释给出的典型用法是perl depgraph.pl dot | dot -Tpng deps.png而r2模式会输出agn添加节点、age添加边、agg渲染图命令序列可直接粘贴进 radare2 的图查看器V图形模式中交互浏览模块依赖。2.symgraph.pl从二进制符号反推依赖libr/symgraph.pl 使用rabin2对每个libr_*.so和binr/下的可执行文件做导入/导出符号分析rabin2 -i $1/libr_$1.so # 导入符号 (imports) rabin2 -s $1/libr_$1.so # 符号表 (symbols)最后把各库的导入、导出符号合并去重并排序cat $t/l/*.i $t/l/*.s $t/b/*.i | sort | uniq -c | sort -n | grep r_这样可以得到哪个r_符号被多少个库/程序引用的统计从符号粒度验证依赖的真实性——比如r_util符号出现频次必然最高对应它在LIBS0中的底层地位。五、给读者的实操建议快速定位模块看到某个r_xxxAPI 时先到 libr/xxx/ 找同名目录再到 libr/include/r_xxx.h 看接口定义核对依赖关系阅读某模块时看该模块Makefile的R2DEPS或运行perl libr/depgraph.pl dot | dot -Tpng生成当前版本的真实依赖图——doc/rgraph.md是历史快照构建脚本才是权威理解扩展方式几乎所有模块都有p/plugin子目录新增指令集、文件系统、调试后端都通过插件形式接入这正是图中plugins节点存在的意义从入口入手想读源码时优先读 libr/core/core.c 的r_core_new与 binr/radare2/radare2.c它们会依次初始化图中各模块是理解依赖关系的活文档。总而言之doc/rgraph.md虽然简短却精准概括了 radare2 二十年架构演进中最稳定的部分core居中调度io向下对接插件与底层资源config/cons提供基础服务asm/bin/anal完成静态分析debug/bp/reg/syscall支撑动态调试flags/meta沉淀一切分析结果而cmd/search/print与lang/macro则负责交互与脚本化。理解这张图就掌握了阅读 radare2 数万行源码的第一张地图。赞分享逆向工程网络安全【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址https://gitcode.com/gh_mirrors/ra/radare2点击查看免费下载相关推荐彻底搞懂deck.gl模块化架构核心、图层与扩展的依赖关系全解析彻底搞懂deck.gl模块化架构核心、图层与扩展的依赖关系全解析 deck.gl作为WebGL2驱动的可视化框架其模块化架构设计是实现高性能地理空间数据可视前端数据可视化3D渲染图形学10分钟搞懂SeaTunnel源码架构核心模块与依赖关系全解析10分钟搞懂SeaTunnel源码架构核心模块与依赖关系全解析 你是否在数据同步时遇到过系统卡顿、连接器不兼容、监控不到位的问题作为下一代超高性能分布式数据数据工程大数据批处理流处理UI-Router源码架构核心模块与依赖关系解析UI Router源码架构核心模块与依赖关系解析 引言 UI Router作为AngularJS生态中最流行的路由解决方案其源码架构设计体现了复杂单页应用前端路由上一篇如何高效使用Stable Video Infinity专业级视频修复实战指南下一篇Intel RealSense在Jetson Orin Nano上的设备检测问题分析与解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/20 17:26:26

Linux驱动自动加载全解析:从内核模块到设备树实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 17:26:26

python-pptx生成软件开发答辩PPT:从流程骨架到现场答辩

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 18:26:33

Bili.Uwp 上手指南:Windows 上跑起自己的 UWP 哔哩哔哩客户端

Bili.Uwp 上手指南:Windows 上跑起自己的 UWP 哔哩哔哩客户端 【免费下载链接】Bili.Uwp 适用于新系统UI的哔哩 项目地址: https://gitcode.com/GitHub_Trending/bi/Bili.Uwp Bili.Uwp(仓库内名为“哔哩”)是一款用 C# 和 UWP 框架开发…

2026/9/20 18:26:33

Atlas 300V实战:从ONNX到OM,用CANN部署YOLO推理模型

1. 先别急着部署,Atlas 300V到底是个什么"卡"看到"atlas 300v 24g 是运算加速卡吗"这个问题的时候,我基本能猜到提问的人正处于哪个阶段:手里刚刚拿到一块Atlas 300V,插到服务器上,正准备像装NVID…

2026/9/20 18:26:33

KataGo围棋AI配置与优化全指南

1. 项目概述KataGo作为当前最强大的开源围棋AI之一,其神经网络架构和搜索算法在棋力表现上已经超越了许多商业软件。不同于传统围棋引擎,KataGo采用蒙特卡洛树搜索(MCTS)与深度神经网络结合的架构,支持自定义规则和让子…

2026/9/20 18:26:33

AIGC模型部署方案详解:本地、云端与混合架构的选型与实战

过去一年里,找我咨询“AIGC模型部署”的人比预想中多得多。多数人不是不会跑代码,而是卡在第一个选择题上:到底是买一台机器在本地部署,还是直接调云端API,又或者两边各放一部分形成混合架构。这个决策直接影响后面的成…

2026/9/20 18:21:33

Edge垂直标签页设置教程:宽屏效率提升与标签管理技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码