diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf33250..06b5f9f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,3 +25,27 @@ jobs: run: r2r test/db/cmd - name: Radare Extras Testing run: r2r test/db/extras + + r2-xps: + name: Build radare2 with r2flutter XPS + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + - name: Install build dependencies + run: sudo apt-get update -y && sudo apt-get install -y build-essential pkg-config + - name: Build radare2 from source with r2flutter + run: | + git clone --depth=1 https://github.com/radareorg/radare2.git + cd radare2 + cp -f ../r2plugin/config.mk libr/xps/config.mk + git clone .. libr/xps/p/r2flutter + make -C libr/xps + ./configure --prefix=/usr + make -j$(nproc) + sudo make install + - name: Test embedded r2flutter plugin + run: | + r2 -q -c 'Lc~r2flutter' -- | grep r2flutter + r2 -q -c 'r2flutter -V' -- | grep 'r2flutter ' diff --git a/r2plugin/README.md b/r2plugin/README.md new file mode 100644 index 0000000..ebab7ac --- /dev/null +++ b/r2plugin/README.md @@ -0,0 +1,13 @@ +# r2plugin + +This directory contains the Make and Meson files required to link r2flutter +inside radare2 through `libr/xps`. + +```console +cd radare2 +cp ../r2flutter/r2plugin/config.mk libr/xps/config.mk +git clone ../r2flutter libr/xps/p/r2flutter +make -C libr/xps +./configure +make +``` diff --git a/r2plugin/config.mk b/r2plugin/config.mk new file mode 100644 index 0000000..c783f70 --- /dev/null +++ b/r2plugin/config.mk @@ -0,0 +1,9 @@ +EXTERNAL_PLUGINS+=r2flutter +# EXTERNAL_PLUGINS+=hi + +.PHONY: r2flutter + +r2flutter: p/r2flutter + +p/r2flutter: + cd p && git clone https://github.com/trufae/r2flutter diff --git a/r2plugin/core/deps.h b/r2plugin/core/deps.h new file mode 100644 index 0000000..3e23fbb --- /dev/null +++ b/r2plugin/core/deps.h @@ -0,0 +1,5 @@ +/* radare2 - MIT - Copyright 2026 - pancake */ + +#ifdef R2_CORE_H +extern RCorePlugin r_core_plugin_r2flutter; +#endif diff --git a/r2plugin/core/deps.mk b/r2plugin/core/deps.mk new file mode 100644 index 0000000..cccef29 --- /dev/null +++ b/r2plugin/core/deps.mk @@ -0,0 +1,25 @@ +R2FLUTTER_CORE_WD=$(LIBR)/xps/p/r2flutter +CFLAGS+=-I$(R2FLUTTER_CORE_WD)/include +R2FLUTTER_CORE_OBJ= \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_app.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_dumper.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_snapshot.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_discovery.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_names.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_strings.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_data_image.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_it.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_xrefs.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_object.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_sbom.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_clusters.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_classes.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_model.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_parse.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_pool_modern.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_version.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_cid.o \ + $(R2FLUTTER_CORE_WD)/src/lib/dart_obf.o \ + $(R2FLUTTER_CORE_WD)/src/r2/flutter_analysis.o \ + $(R2FLUTTER_CORE_WD)/src/r2/core_flutter.o +EXTERNAL_STATIC_OBJS+=$(R2FLUTTER_CORE_OBJ) diff --git a/r2plugin/core/meson.build b/r2plugin/core/meson.build new file mode 100644 index 0000000..87e9d3a --- /dev/null +++ b/r2plugin/core/meson.build @@ -0,0 +1,29 @@ +shared_library( + 'core_flutter', + '../src/r2/core_flutter.c', + '../src/r2/flutter_analysis.c', + '../src/lib/dart_app.c', + '../src/lib/dart_dumper.c', + '../src/lib/dart_pool_snapshot.c', + '../src/lib/dart_pool_discovery.c', + '../src/lib/dart_pool_names.c', + '../src/lib/dart_pool_strings.c', + '../src/lib/dart_pool_data_image.c', + '../src/lib/dart_pool_it.c', + '../src/lib/dart_pool_xrefs.c', + '../src/lib/dart_object.c', + '../src/lib/dart_sbom.c', + '../src/lib/dart_pool_clusters.c', + '../src/lib/dart_pool_classes.c', + '../src/lib/dart_pool_model.c', + '../src/lib/dart_pool_parse.c', + '../src/lib/dart_pool_modern.c', + '../src/lib/dart_version.c', + '../src/lib/dart_cid.c', + '../src/lib/dart_obf.c', + include_directories: ['../include', include_dirs], + dependencies: r2_core, + override_options: ['werror=false'], + install: true, + install_dir: r2_plugdir, +) diff --git a/r2plugin/meson.build b/r2plugin/meson.build new file mode 100644 index 0000000..eee0add --- /dev/null +++ b/r2plugin/meson.build @@ -0,0 +1,32 @@ +# r2flutter XPS integration for radare2. +# Included from libr/xps/meson.build when r2flutter sources live under +# libr/xps/p/r2flutter/. Appends sources and include paths to the r_core +# aggregate so the static plugin is linked into libr_core. + +core_plugins += ['r2flutter'] + +r_core_additional_inc += include_directories(join_paths('..', 'include')) + +r_core_additional_sources += files( + '../src/lib/dart_app.c', + '../src/lib/dart_dumper.c', + '../src/lib/dart_pool_snapshot.c', + '../src/lib/dart_pool_discovery.c', + '../src/lib/dart_pool_names.c', + '../src/lib/dart_pool_strings.c', + '../src/lib/dart_pool_data_image.c', + '../src/lib/dart_pool_it.c', + '../src/lib/dart_pool_xrefs.c', + '../src/lib/dart_object.c', + '../src/lib/dart_sbom.c', + '../src/lib/dart_pool_clusters.c', + '../src/lib/dart_pool_classes.c', + '../src/lib/dart_pool_model.c', + '../src/lib/dart_pool_parse.c', + '../src/lib/dart_pool_modern.c', + '../src/lib/dart_version.c', + '../src/lib/dart_cid.c', + '../src/lib/dart_obf.c', + '../src/r2/flutter_analysis.c', + '../src/r2/core_flutter.c', +) diff --git a/r2plugin/r2plugins.h b/r2plugin/r2plugins.h new file mode 100644 index 0000000..80e7556 --- /dev/null +++ b/r2plugin/r2plugins.h @@ -0,0 +1,5 @@ +/* radare2 - MIT - Copyright 2026 - pancake */ + +#ifdef R2_CORE_H +#include "core/deps.h" +#endif diff --git a/r2plugin/static.cfg b/r2plugin/static.cfg new file mode 100644 index 0000000..1787787 --- /dev/null +++ b/r2plugin/static.cfg @@ -0,0 +1 @@ +core.r2flutter diff --git a/src/r2/core_flutter.c b/src/r2/core_flutter.c index 3c51ba1..caf392d 100644 --- a/src/r2/core_flutter.c +++ b/src/r2/core_flutter.c @@ -427,7 +427,7 @@ static bool r_cmd_r2flutter_call(RCorePluginSession *cps, const char *input) { return true; } -RCorePlugin r_core_plugin_flutter = { +RCorePlugin r_core_plugin_r2flutter = { .meta = { .name = "r2flutter", .desc = "Dart/Flutter AOT snapshot analyzer", @@ -443,7 +443,7 @@ RCorePlugin r_core_plugin_flutter = { #ifndef R2_PLUGIN_INCORE R_API RLibStruct radare_plugin = { .type = R_LIB_TYPE_CORE, - .data = &r_core_plugin_flutter, + .data = &r_core_plugin_r2flutter, .version = R2_VERSION, .abiversion = R2_ABIVERSION };