summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-10-22 02:09:10 -0400
committerMason Reed <mason@vector35.com>2025-10-22 14:51:07 -0400
commit551738c693b52b8c383eab629fbc9d81d04d4c4b (patch)
treec2da8e1ebc3f69715ec8710f89f1c23241d4ac10
parent5ae046509bb7c5c0a5c338793ebc3902820ac9e7 (diff)
Add more plugins to free
Adds WARP, DWARF Import and Objective-C plugins to free
-rw-r--r--Cargo.lock59
-rw-r--r--Cargo.toml3
-rw-r--r--plugins/dwarf/dwarf_import/CMakeLists.txt203
-rw-r--r--plugins/dwarf/dwarf_import/Cargo.toml3
-rw-r--r--plugins/dwarf/dwarf_import/demo/Cargo.toml24
-rw-r--r--plugins/dwarf/dwarf_import/demo/build.rs30
-rw-r--r--plugins/dwarf/dwarf_import/src/lib.rs18
-rw-r--r--plugins/warp/CMakeLists.txt115
-rw-r--r--plugins/warp/Cargo.toml3
-rw-r--r--plugins/warp/api/CMakeLists.txt24
-rw-r--r--plugins/warp/demo/Cargo.toml45
-rw-r--r--plugins/warp/demo/build.rs29
-rw-r--r--plugins/warp/src/plugin.rs20
-rw-r--r--plugins/warp/ui/CMakeLists.txt6
-rw-r--r--plugins/warp/ui/plugin.cpp6
-rw-r--r--plugins/workflow_objc/CMakeLists.txt173
-rw-r--r--plugins/workflow_objc/Cargo.toml3
-rw-r--r--plugins/workflow_objc/demo/Cargo.toml21
-rw-r--r--plugins/workflow_objc/demo/build.rs15
-rw-r--r--plugins/workflow_objc/src/lib.rs35
20 files changed, 652 insertions, 183 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 2290dd5d..8dca5e25 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -693,6 +693,22 @@ dependencies = [
]
[[package]]
+name = "dwarf_import-static"
+version = "0.1.0"
+dependencies = [
+ "binaryninja",
+ "binaryninjacore-sys",
+ "cpp_demangle",
+ "dwarfreader",
+ "gimli",
+ "indexmap",
+ "iset",
+ "log",
+ "object 0.36.7",
+ "regex",
+]
+
+[[package]]
name = "dwarfdump"
version = "0.1.0"
dependencies = [
@@ -2423,6 +2439,36 @@ dependencies = [
]
[[package]]
+name = "warp_ninja-static"
+version = "0.1.0"
+dependencies = [
+ "ar",
+ "arboard",
+ "base64",
+ "binaryninja",
+ "binaryninjacore-sys",
+ "compact_str",
+ "criterion",
+ "dashmap",
+ "directories",
+ "insta",
+ "itertools 0.14.0",
+ "log",
+ "minijinja",
+ "minijinja-embed",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_json",
+ "serde_qs",
+ "tempdir",
+ "thiserror 2.0.12",
+ "uuid",
+ "walkdir",
+ "warp",
+]
+
+[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2777,6 +2823,19 @@ dependencies = [
]
[[package]]
+name = "workflow_objc-static"
+version = "0.1.0"
+dependencies = [
+ "binaryninja",
+ "binaryninjacore-sys",
+ "bstr",
+ "dashmap",
+ "log",
+ "once_cell",
+ "thiserror 2.0.12",
+]
+
+[[package]]
name = "x11rb"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 4f425e9e..d1bec12b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,6 +11,7 @@ members = [
"rust/plugin_examples/data_renderer",
"view/minidump",
"plugins/dwarf/dwarf_import",
+ "plugins/dwarf/dwarf_import/demo",
"plugins/dwarf/dwarf_export",
"plugins/dwarf/dwarfdump",
"plugins/dwarf/shared",
@@ -20,7 +21,9 @@ members = [
"plugins/svd",
"plugins/svd/demo",
"plugins/warp",
+ "plugins/warp/demo",
"plugins/workflow_objc",
+ "plugins/workflow_objc/demo",
]
[workspace.dependencies]
diff --git a/plugins/dwarf/dwarf_import/CMakeLists.txt b/plugins/dwarf/dwarf_import/CMakeLists.txt
index dcad561b..b3b18071 100644
--- a/plugins/dwarf/dwarf_import/CMakeLists.txt
+++ b/plugins/dwarf/dwarf_import/CMakeLists.txt
@@ -2,92 +2,167 @@ cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
project(dwarf_import)
-file(GLOB PLUGIN_SOURCES CONFIGURE_DEPENDS
- ${PROJECT_SOURCE_DIR}/Cargo.toml
- ${PROJECT_SOURCE_DIR}/src/*.rs
- ${PROJECT_SOURCE_DIR}/../shared/Cargo.toml
- ${PROJECT_SOURCE_DIR}/../shared/src/*.rs)
+if(NOT BN_API_BUILD_EXAMPLES AND NOT BN_INTERNAL_BUILD)
+ if(NOT BN_API_PATH)
+ # If we have not already defined the API source directory try and find it.
+ find_path(
+ BN_API_PATH
+ NAMES binaryninjaapi.h
+ # List of paths to search for the clone of the api
+ HINTS ../../.. ../../binaryninja/api/ binaryninjaapi binaryninja-api $ENV{BN_API_PATH}
+ REQUIRED
+ )
+ endif()
+ set(CARGO_STABLE_VERSION 1.83.0)
+ add_subdirectory(${BN_API_PATH} binaryninjaapi)
+endif()
-file(GLOB API_SOURCES CONFIGURE_DEPENDS
- ${PROJECT_SOURCE_DIR}/../../../binaryninjacore.h
- ${PROJECT_SOURCE_DIR}/../../../rust/binaryninjacore-sys/build.rs
- ${PROJECT_SOURCE_DIR}/../../../rust/binaryninjacore-sys/Cargo.toml
- ${PROJECT_SOURCE_DIR}/../../../rust/binaryninjacore-sys/src/*
- ${PROJECT_SOURCE_DIR}/../../../rust/Cargo.toml
- ${PROJECT_SOURCE_DIR}/../../../rust/src/*.rs)
+file(GLOB_RECURSE PLUGIN_SOURCES CONFIGURE_DEPENDS
+ ${PROJECT_SOURCE_DIR}/Cargo.toml
+ ${PROJECT_SOURCE_DIR}/src/*.rs)
if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
- set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
+ if(DEMO)
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
+ else()
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
+ endif()
else()
- set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
- set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
- set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}dwarf_import.pdb)
+ if(DEMO)
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
+ else()
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
+ endif()
+endif()
+
+if(FORCE_COLORED_OUTPUT)
+ set(CARGO_OPTS ${CARGO_OPTS} --color always)
endif()
-set(OUTPUT_FILE ${CMAKE_STATIC_LIBRARY_PREFIX}dwarf_import${CMAKE_SHARED_LIBRARY_SUFFIX})
-set(PLUGIN_PATH ${TARGET_DIR}/${OUTPUT_FILE})
+if(DEMO)
+ set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)
-add_custom_target(dwarf_import ALL DEPENDS ${PLUGIN_PATH})
-add_dependencies(dwarf_import binaryninjaapi)
+ set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
+ set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
+ set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
+ set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})
-find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
-if(CARGO_API_VERSION)
- set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_API_VERSION} cargo build)
+ set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
else()
- set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo build)
+ # NOTE: --no-default-features is set to disable building artifacts used for testing
+ # NOTE: the linker is looking in the target dir and linking on it apparently.
+ set(CARGO_FEATURES "--no-default-features")
+
+ set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
+ set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
+ set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
+ set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})
+
+ set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
endif()
+
+add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
+add_dependencies(${PROJECT_NAME} binaryninjaapi)
+get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
+list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
+find_package(BinaryNinjaCore REQUIRED)
+
+set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
+
+# Add the whole api to the depends too
+file(GLOB API_SOURCES CONFIGURE_DEPENDS
+ ${BN_API_SOURCE_DIR}/binaryninjacore.h
+ ${BN_API_SOURCE_DIR}/rust/src/*.rs
+ ${BN_API_SOURCE_DIR}/rust/binaryninjacore-sys/src/*.rs)
+
+find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
+set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
+
if(APPLE)
if(UNIVERSAL)
if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE})
- set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE})
+ if(DEMO)
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
+ else()
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ endif()
else()
- set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE})
- set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE})
+ if(DEMO)
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
+ else()
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ endif()
endif()
add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env
- MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR}
- ${RUSTUP_COMMAND} --target=aarch64-apple-darwin ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E env
- MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR}
- ${RUSTUP_COMMAND} --target=x86_64-apple-darwin ${CARGO_OPTS}
- COMMAND mkdir -p ${TARGET_DIR}
- COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} clean --target=aarch64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} clean --target=x86_64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} build --target=aarch64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} build --target=x86_64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${OUTPUT_FILE_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
else()
- if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(LIB_PATH ${PROJECT_BINARY_DIR}/target/debug/${OUTPUT_FILE})
- else()
- set(LIB_PATH ${PROJECT_BINARY_DIR}/target/release/${OUTPUT_FILE})
- endif()
-
add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
endif()
elseif(WIN32)
- add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${BN_CORE_PLUGIN_DIR}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ if(DEMO)
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
+ else()
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
+ endif()
else()
add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
endif()
diff --git a/plugins/dwarf/dwarf_import/Cargo.toml b/plugins/dwarf/dwarf_import/Cargo.toml
index ca06b11b..15f3fda8 100644
--- a/plugins/dwarf/dwarf_import/Cargo.toml
+++ b/plugins/dwarf/dwarf_import/Cargo.toml
@@ -7,6 +7,9 @@ license = "Apache-2.0"
[lib]
crate-type = ["cdylib"]
+[features]
+demo = []
+
[dependencies]
dwarfreader = { path = "../shared/" }
binaryninja.workspace = true
diff --git a/plugins/dwarf/dwarf_import/demo/Cargo.toml b/plugins/dwarf/dwarf_import/demo/Cargo.toml
new file mode 100644
index 00000000..e088fb68
--- /dev/null
+++ b/plugins/dwarf/dwarf_import/demo/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "dwarf_import-static"
+version = "0.1.0"
+edition = "2021"
+license = "Apache-2.0"
+
+[lib]
+crate-type = ["staticlib"]
+path = "../src/lib.rs"
+
+[features]
+demo = []
+
+[dependencies]
+dwarfreader = { path = "../../shared/" }
+binaryninja = { workspace = true, features = ["demo"]}
+binaryninjacore-sys.workspace = true
+gimli = "0.31"
+log = "0.4"
+iset = "0.2.2"
+cpp_demangle = "0.4.3"
+regex = "1"
+indexmap = "2.5.0"
+object = "0.36"
diff --git a/plugins/dwarf/dwarf_import/demo/build.rs b/plugins/dwarf/dwarf_import/demo/build.rs
new file mode 100644
index 00000000..8cbaf2b1
--- /dev/null
+++ b/plugins/dwarf/dwarf_import/demo/build.rs
@@ -0,0 +1,30 @@
+fn main() {
+ let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
+ .expect("DEP_BINARYNINJACORE_PATH not specified");
+
+ println!("cargo::rustc-link-lib=dylib=binaryninjacore");
+ println!(
+ "cargo::rustc-link-search={}",
+ link_path
+ .to_str()
+ .expect("Failed to convert link path to string")
+ );
+
+ #[cfg(target_os = "linux")]
+ {
+ println!(
+ "cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
+ link_path.to_string_lossy()
+ );
+ }
+
+ #[cfg(target_os = "macos")]
+ {
+ let crate_name = std::env::var("CARGO_PKG_NAME").expect("CARGO_PKG_NAME not set");
+ let lib_name = crate_name.replace('-', "_");
+ println!(
+ "cargo::rustc-link-arg=-Wl,-install_name,@rpath/lib{}.dylib",
+ lib_name
+ );
+ }
+}
diff --git a/plugins/dwarf/dwarf_import/src/lib.rs b/plugins/dwarf/dwarf_import/src/lib.rs
index 8ad5e442..6e9626aa 100644
--- a/plugins/dwarf/dwarf_import/src/lib.rs
+++ b/plugins/dwarf/dwarf_import/src/lib.rs
@@ -756,8 +756,7 @@ impl CustomDebugInfoParser for DWARFParser {
}
}
-#[no_mangle]
-pub extern "C" fn CorePluginInit() -> bool {
+fn plugin_init() {
Logger::new("DWARF").init();
let settings = Settings::new();
@@ -820,5 +819,20 @@ pub extern "C" fn CorePluginInit() -> bool {
);
DebugInfoParser::register("DWARF", DWARFParser {});
+}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(not(feature = "demo"))]
+pub extern "C" fn CorePluginInit() -> bool {
+ plugin_init();
+ true
+}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(feature = "demo")]
+pub extern "C" fn DwarfImportPluginInit() -> bool {
+ plugin_init();
true
}
diff --git a/plugins/warp/CMakeLists.txt b/plugins/warp/CMakeLists.txt
index 4b680b40..00c2f37a 100644
--- a/plugins/warp/CMakeLists.txt
+++ b/plugins/warp/CMakeLists.txt
@@ -29,45 +29,69 @@ if(NOT HEADLESS)
endif()
if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
- set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
+ if(DEMO)
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
+ else()
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
+ endif()
else()
- set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
- set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
+ if(DEMO)
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
+ else()
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
+ endif()
endif()
if(FORCE_COLORED_OUTPUT)
set(CARGO_OPTS ${CARGO_OPTS} --color always)
endif()
-# NOTE: --no-default-features is set to disable building artifacts used for testing
-# NOTE: the linker is looking in the target dir and linking on it apparently.
-set(CARGO_FEATURES "--no-default-features")
-set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
-set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
-set(OUTPUT_LIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.dll.lib)
-set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
-set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
-set(OUTPUT_LIB_PATH ${BN_CORE_PLUGIN_DIR}/${PROJECT_NAME}.lib)
-
# warp_ninja_interface is the target hack im going with for now to get warp_api to build on windows
add_library(${PROJECT_NAME}_interface INTERFACE)
add_dependencies(${PROJECT_NAME}_interface ${PROJECT_NAME})
+if(DEMO)
+ set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)
+
+ set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
+ set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
+ set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
+ set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})
+
+ set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
+else()
+ # NOTE: --no-default-features is set to disable building artifacts used for testing
+ # NOTE: the linker is looking in the target dir and linking on it apparently.
+ set(CARGO_FEATURES "--no-default-features")
+
+ set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
+ set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
+ set(OUTPUT_LIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.dll.lib)
+ set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
+ set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})
+ set(OUTPUT_LIB_PATH ${BN_CORE_PLUGIN_DIR}/${PROJECT_NAME}.lib)
+
+ set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
+endif()
+
+
add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
add_dependencies(${PROJECT_NAME} binaryninjaapi)
get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
find_package(BinaryNinjaCore REQUIRED)
-set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
-
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
# Add the whole api to the depends too
file(GLOB API_SOURCES CONFIGURE_DEPENDS
${BN_API_SOURCE_DIR}/binaryninjacore.h
- ${BN_API_SOURCE_DIR}/rust/src/*/*.rs)
+ ${BN_API_SOURCE_DIR}/rust/src/*.rs
+ ${BN_API_SOURCE_DIR}/rust/binaryninjacore-sys/src/*.rs)
find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
@@ -75,11 +99,21 @@ set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
if(APPLE)
if(UNIVERSAL)
if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
- set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ if(DEMO)
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
+ else()
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ endif()
else()
- set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
- set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ if(DEMO)
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
+ else()
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ endif()
endif()
add_custom_command(
@@ -101,12 +135,6 @@ if(APPLE)
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
else()
- if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(LIB_PATH ${PROJECT_BINARY_DIR}/target/debug/${OUTPUT_FILE_NAME})
- else()
- set(LIB_PATH ${PROJECT_BINARY_DIR}/target/release/${OUTPUT_FILE_NAME})
- endif()
-
add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E env
@@ -115,22 +143,33 @@ if(APPLE)
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
- COMMAND ${CMAKE_COMMAND} -E copy ${LIB_PATH} ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
endif()
elseif(WIN32)
- add_custom_command(
- OUTPUT ${OUTPUT_FILE_PATH} ${OUTPUT_PDB_PATH} ${OUTPUT_LIB_PATH}
- COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
- COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
- COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
- COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
- COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_LIB_NAME} ${OUTPUT_LIB_PATH}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
- )
+ if(DEMO)
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
+ else()
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILE_PATH} ${OUTPUT_LIB_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_LIB_NAME} ${OUTPUT_LIB_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
+ endif()
else()
add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
diff --git a/plugins/warp/Cargo.toml b/plugins/warp/Cargo.toml
index ccdd0fc5..1e4ecb5e 100644
--- a/plugins/warp/Cargo.toml
+++ b/plugins/warp/Cargo.toml
@@ -7,6 +7,9 @@ license = "Apache-2.0"
[lib]
crate-type = ["lib", "cdylib"]
+[features]
+demo = []
+
[dependencies]
binaryninja = { workspace = true, features = ["rayon"] }
binaryninjacore-sys.workspace = true
diff --git a/plugins/warp/api/CMakeLists.txt b/plugins/warp/api/CMakeLists.txt
index 6d548e6d..c854a200 100644
--- a/plugins/warp/api/CMakeLists.txt
+++ b/plugins/warp/api/CMakeLists.txt
@@ -27,18 +27,22 @@ endif()
# Link to the warp plugin.
# TODO: Need to make this less scuffed, but this will do for now.
-if (WIN32)
- # By linking to warp_ninja_interface we insure that we get built _after_ the lib has been generated.
- target_link_libraries(${PROJECT_NAME} warp_ninja_interface "${BN_CORE_PLUGIN_DIR}/warp_ninja.lib")
+if (DEMO)
+ target_link_libraries(${PROJECT_NAME} warp_ninja_interface ${CMAKE_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}warp_ninja_static${CMAKE_STATIC_LIBRARY_SUFFIX})
else ()
- target_link_libraries(${PROJECT_NAME} warp_ninja_interface ${BN_CORE_PLUGIN_DIR}/libwarp_ninja${CMAKE_SHARED_LIBRARY_SUFFIX})
- # Set RPATH so the library can be found at runtime
- if(APPLE)
- set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "@loader_path")
- else()
- set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "$ORIGIN")
+ if (WIN32)
+ # By linking to warp_ninja_interface we insure that we get built _after_ the lib has been generated.
+ target_link_libraries(${PROJECT_NAME} warp_ninja_interface "${BN_CORE_PLUGIN_DIR}/warp_ninja.lib")
+ else ()
+ target_link_libraries(${PROJECT_NAME} warp_ninja_interface ${BN_CORE_PLUGIN_DIR}/libwarp_ninja${CMAKE_SHARED_LIBRARY_SUFFIX})
+ # Set RPATH so the library can be found at runtime
+ if(APPLE)
+ set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "@loader_path")
+ else()
+ set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "$ORIGIN")
+ endif()
endif()
-endif()
+endif ()
set_target_properties(warp_api PROPERTIES
CXX_STANDARD 20
diff --git a/plugins/warp/demo/Cargo.toml b/plugins/warp/demo/Cargo.toml
new file mode 100644
index 00000000..8e1070e3
--- /dev/null
+++ b/plugins/warp/demo/Cargo.toml
@@ -0,0 +1,45 @@
+[package]
+name = "warp_ninja-static"
+version = "0.1.0"
+edition = "2021"
+license = "Apache-2.0"
+
+[lib]
+crate-type = ["lib", "staticlib"]
+path = "../src/lib.rs"
+
+[features]
+demo = []
+
+[dependencies]
+binaryninja = { workspace = true, features = ["rayon", "demo"] }
+binaryninjacore-sys.workspace = true
+warp = { git = "https://github.com/Vector35/warp/", tag = "1.0.0" }
+log = "0.4"
+itertools = "0.14.0"
+dashmap = { version = "6.1", features = ["rayon"]}
+rayon = "1.10"
+arboard = "3.4"
+walkdir = "2.5"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+uuid = { version = "1.12.0", features = ["v4", "serde"] }
+thiserror = "2.0"
+ar = { git = "https://github.com/mdsteele/rust-ar" }
+tempdir = "0.3.7"
+regex = "1.11"
+directories = "6.0"
+compact_str = { version = "0.9.0", features = ["serde"] }
+base64 = "0.22"
+serde_qs = "0.15"
+
+# For reports
+minijinja = "2.10.2"
+minijinja-embed = "2.10.2"
+
+[build-dependencies]
+minijinja-embed = "2.10.2"
+
+[dev-dependencies]
+criterion = "0.6"
+insta = { version = "1.42", features = ["yaml"] }
diff --git a/plugins/warp/demo/build.rs b/plugins/warp/demo/build.rs
new file mode 100644
index 00000000..d0912f90
--- /dev/null
+++ b/plugins/warp/demo/build.rs
@@ -0,0 +1,29 @@
+fn main() {
+ let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
+ .expect("DEP_BINARYNINJACORE_PATH not specified");
+
+ println!("cargo::rustc-link-lib=dylib=binaryninjacore");
+ println!("cargo::rustc-link-search={}", link_path.to_str().unwrap());
+
+ #[cfg(not(target_os = "windows"))]
+ {
+ println!(
+ "cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
+ link_path.to_string_lossy()
+ );
+ }
+
+ #[cfg(target_os = "macos")]
+ {
+ let crate_name = std::env::var("CARGO_PKG_NAME").expect("CARGO_PKG_NAME not set");
+ let lib_name = crate_name.replace('-', "_");
+ println!(
+ "cargo::rustc-link-arg=-Wl,-install_name,@rpath/lib{}.dylib",
+ lib_name
+ );
+ }
+
+ println!("cargo::rerun-if-changed=../src/templates");
+ // Templates used for rendering reports.
+ minijinja_embed::embed_templates!("../src/templates");
+}
diff --git a/plugins/warp/src/plugin.rs b/plugins/warp/src/plugin.rs
index 16462f00..4364508b 100644
--- a/plugins/warp/src/plugin.rs
+++ b/plugins/warp/src/plugin.rs
@@ -116,9 +116,7 @@ fn load_network_container() {
background_task.finish();
}
-#[no_mangle]
-#[allow(non_snake_case)]
-pub extern "C" fn CorePluginInit() -> bool {
+fn plugin_init() -> bool {
Logger::new("WARP").with_level(LevelFilter::Debug).init();
// Register our matcher and plugin settings globally.
@@ -249,3 +247,19 @@ pub extern "C" fn CorePluginInit() -> bool {
true
}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(feature = "demo")]
+pub extern "C" fn WarpPluginInit() -> bool {
+ plugin_init();
+ true
+}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(not(feature = "demo"))]
+pub extern "C" fn CorePluginInit() -> bool {
+ plugin_init();
+ true
+}
diff --git a/plugins/warp/ui/CMakeLists.txt b/plugins/warp/ui/CMakeLists.txt
index 88cc6a60..328289ac 100644
--- a/plugins/warp/ui/CMakeLists.txt
+++ b/plugins/warp/ui/CMakeLists.txt
@@ -19,7 +19,11 @@ set(CMAKE_AUTORCC ON)
find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)
-add_library(${PROJECT_NAME} SHARED ${SOURCES} ${MOCS})
+if (DEMO)
+ add_library(${PROJECT_NAME} STATIC ${SOURCES} ${MOCS})
+else ()
+ add_library(${PROJECT_NAME} SHARED ${SOURCES} ${MOCS})
+endif ()
target_include_directories(${PROJECT_NAME} PRIVATE ../api)
diff --git a/plugins/warp/ui/plugin.cpp b/plugins/warp/ui/plugin.cpp
index f3c1639b..79b6c9ff 100644
--- a/plugins/warp/ui/plugin.cpp
+++ b/plugins/warp/ui/plugin.cpp
@@ -247,13 +247,19 @@ extern "C"
{
BN_DECLARE_UI_ABI_VERSION
+#ifndef DEMO_EDITION
BINARYNINJAPLUGIN void CorePluginDependencies()
{
// We must have WARP to enable this plugin!
AddRequiredPluginDependency("warp_ninja");
}
+#endif
+#ifdef DEMO_EDITION
+ bool WarpUIPluginInit()
+#else
BINARYNINJAPLUGIN bool UIPluginInit()
+#endif
{
RegisterWarpFetchFunctionsCommand();
Sidebar::addSidebarWidgetType(new WarpSidebarWidgetType());
diff --git a/plugins/workflow_objc/CMakeLists.txt b/plugins/workflow_objc/CMakeLists.txt
index 69127ece..b461e3d5 100644
--- a/plugins/workflow_objc/CMakeLists.txt
+++ b/plugins/workflow_objc/CMakeLists.txt
@@ -21,6 +21,60 @@ file(GLOB_RECURSE PLUGIN_SOURCES CONFIGURE_DEPENDS
${PROJECT_SOURCE_DIR}/Cargo.toml
${PROJECT_SOURCE_DIR}/src/*.rs)
+if(CMAKE_BUILD_TYPE MATCHES Debug)
+ if(DEMO)
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
+ else()
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
+ endif()
+else()
+ if(DEMO)
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
+ else()
+ set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
+ set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
+ endif()
+endif()
+
+if(FORCE_COLORED_OUTPUT)
+ set(CARGO_OPTS ${CARGO_OPTS} --color always)
+endif()
+
+if(DEMO)
+ set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)
+
+ set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
+ set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
+ set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
+ set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})
+
+ set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
+else()
+ # NOTE: --no-default-features is set to disable building artifacts used for testing
+ # NOTE: the linker is looking in the target dir and linking on it apparently.
+ set(CARGO_FEATURES "--no-default-features")
+
+ set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
+ set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
+ set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
+ set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})
+
+ set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
+endif()
+
+
+add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
+add_dependencies(${PROJECT_NAME} binaryninjaapi)
+get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
+list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
+find_package(BinaryNinjaCore REQUIRED)
+
+set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
+
+# Add the whole api to the depends too
file(GLOB_RECURSE API_SOURCES CONFIGURE_DEPENDS
${PROJECT_SOURCE_DIR}/../../binaryninjacore.h
${PROJECT_SOURCE_DIR}/../../rust/binaryninjacore-sys/build.rs
@@ -29,78 +83,89 @@ file(GLOB_RECURSE API_SOURCES CONFIGURE_DEPENDS
${PROJECT_SOURCE_DIR}/../../rust/Cargo.toml
${PROJECT_SOURCE_DIR}/../../rust/src/*/*.rs)
-if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
- set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
-else()
- set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
- set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
- set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}workflow_objc.pdb)
-endif()
-
-set(OUTPUT_FILE ${CMAKE_STATIC_LIBRARY_PREFIX}workflow_objc${CMAKE_SHARED_LIBRARY_SUFFIX})
-set(PLUGIN_PATH ${TARGET_DIR}/${OUTPUT_FILE})
-
-add_custom_target(workflow_objc ALL DEPENDS ${PLUGIN_PATH})
-add_dependencies(workflow_objc binaryninjaapi)
-
find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
-if(CARGO_API_VERSION)
- set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_API_VERSION} cargo build)
-else()
- set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo build)
-endif()
+set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
if(APPLE)
if(UNIVERSAL)
if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE})
- set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE})
+ if(DEMO)
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
+ else()
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
+ endif()
else()
- set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE})
- set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE})
+ if(DEMO)
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
+ else()
+ set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
+ endif()
endif()
add_custom_command(
- OUTPUT ${PLUGIN_PATH}
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} clean --target=aarch64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} clean --target=x86_64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env
- MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR}
- ${RUSTUP_COMMAND} --target=aarch64-apple-darwin ${CARGO_OPTS}
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} build --target=aarch64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND ${CMAKE_COMMAND} -E env
- MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR}
- ${RUSTUP_COMMAND} --target=x86_64-apple-darwin ${CARGO_OPTS}
- COMMAND mkdir -p ${TARGET_DIR}
- COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} build --target=x86_64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
else()
- if(CMAKE_BUILD_TYPE MATCHES Debug)
- set(LIB_PATH ${PROJECT_BINARY_DIR}/target/debug/${OUTPUT_FILE})
- else()
- set(LIB_PATH ${PROJECT_BINARY_DIR}/target/release/${OUTPUT_FILE})
- endif()
-
add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env
+ MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
+ ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
endif()
elseif(WIN32)
- add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${BN_CORE_PLUGIN_DIR}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ if(DEMO)
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
+ else()
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
+ endif()
else()
add_custom_command(
- OUTPUT ${PLUGIN_PATH}
- COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
- COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
+ OUTPUT ${OUTPUT_FILE_PATH}
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
+ COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
+ DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
+ )
endif()
diff --git a/plugins/workflow_objc/Cargo.toml b/plugins/workflow_objc/Cargo.toml
index f6392d9f..024d9d9a 100644
--- a/plugins/workflow_objc/Cargo.toml
+++ b/plugins/workflow_objc/Cargo.toml
@@ -7,6 +7,9 @@ license = "BSD-3-Clause"
[lib]
crate-type = ["staticlib", "cdylib"]
+[features]
+demo = []
+
[dependencies]
binaryninja = { workspace = true }
binaryninjacore-sys.workspace = true
diff --git a/plugins/workflow_objc/demo/Cargo.toml b/plugins/workflow_objc/demo/Cargo.toml
new file mode 100644
index 00000000..bb7f41fa
--- /dev/null
+++ b/plugins/workflow_objc/demo/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "workflow_objc-static"
+version = "0.1.0"
+edition = "2021"
+license = "BSD-3-Clause"
+
+[lib]
+crate-type = ["staticlib"]
+path = "../src/lib.rs"
+
+[features]
+demo = []
+
+[dependencies]
+binaryninja = { workspace = true, features = ["demo"] }
+binaryninjacore-sys.workspace = true
+log = "0.4"
+dashmap = { version = "6.1", features = ["rayon"]}
+once_cell = "1.20"
+thiserror = "2.0"
+bstr = "1.12"
diff --git a/plugins/workflow_objc/demo/build.rs b/plugins/workflow_objc/demo/build.rs
new file mode 100644
index 00000000..ed6cec7d
--- /dev/null
+++ b/plugins/workflow_objc/demo/build.rs
@@ -0,0 +1,15 @@
+fn main() {
+ let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
+ .expect("DEP_BINARYNINJACORE_PATH not specified");
+
+ println!("cargo::rustc-link-lib=dylib=binaryninjacore");
+ println!("cargo::rustc-link-search={}", link_path.to_str().unwrap());
+
+ #[cfg(not(target_os = "windows"))]
+ {
+ println!(
+ "cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
+ link_path.to_string_lossy()
+ );
+ }
+}
diff --git a/plugins/workflow_objc/src/lib.rs b/plugins/workflow_objc/src/lib.rs
index d877301a..8c859c6b 100644
--- a/plugins/workflow_objc/src/lib.rs
+++ b/plugins/workflow_objc/src/lib.rs
@@ -10,17 +10,7 @@ use metadata::GlobalState;
use log::LevelFilter;
-#[no_mangle]
-#[allow(non_snake_case)]
-pub extern "C" fn CorePluginDependencies() {
- add_optional_plugin_dependency("arch_x86");
- add_optional_plugin_dependency("arch_armv7");
- add_optional_plugin_dependency("arch_arm64");
-}
-
-#[no_mangle]
-#[allow(non_snake_case)]
-pub extern "C" fn CorePluginInit() -> bool {
+fn plugin_init() -> bool {
Logger::new("Plugin.Objective-C")
.with_level(LevelFilter::Debug)
.init();
@@ -46,3 +36,26 @@ pub extern "C" fn CorePluginInit() -> bool {
true
}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(not(feature = "demo"))]
+pub extern "C" fn CorePluginDependencies() {
+ add_optional_plugin_dependency("arch_x86");
+ add_optional_plugin_dependency("arch_armv7");
+ add_optional_plugin_dependency("arch_arm64");
+}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(not(feature = "demo"))]
+pub extern "C" fn CorePluginInit() -> bool {
+ plugin_init()
+}
+
+#[no_mangle]
+#[allow(non_snake_case)]
+#[cfg(feature = "demo")]
+pub extern "C" fn WorkflowObjcPluginInit() -> bool {
+ plugin_init()
+}