Skip to content

Commit 84eecdf

Browse files
committed
Include SVD loader in free version
1 parent 2a2e798 commit 84eecdf

File tree

7 files changed

+160
-38
lines changed

7 files changed

+160
-38
lines changed

Cargo.lock

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ members = [
1717
"plugins/pdb-ng",
1818
"plugins/pdb-ng/demo",
1919
"plugins/warp",
20-
"plugins/svd"
20+
"plugins/svd",
21+
"plugins/svd/demo"
2122
]
2223

2324
[workspace.dependencies]

plugins/svd/CMakeLists.txt

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,56 @@ file(GLOB_RECURSE PLUGIN_SOURCES CONFIGURE_DEPENDS
2222
${PROJECT_SOURCE_DIR}/src/*.rs)
2323

2424
if(CMAKE_BUILD_TYPE MATCHES Debug)
25-
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
26-
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
25+
if(DEMO)
26+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
27+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
28+
else()
29+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
30+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
31+
endif()
2732
else()
28-
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
29-
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
33+
if(DEMO)
34+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
35+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
36+
else()
37+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
38+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
39+
endif()
3040
endif()
3141

3242
if(FORCE_COLORED_OUTPUT)
3343
set(CARGO_OPTS ${CARGO_OPTS} --color always)
3444
endif()
3545

36-
# NOTE: --no-default-features is set to disable building artifacts used for testing
37-
# NOTE: the linker is looking in the target dir and linking on it apparently.
38-
set(CARGO_FEATURES "--no-default-features")
39-
set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
40-
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
41-
set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
42-
set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
46+
if(DEMO)
47+
set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)
48+
49+
set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
50+
set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
51+
set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
52+
set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})
53+
54+
set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
55+
else()
56+
# NOTE: --no-default-features is set to disable building artifacts used for testing
57+
# NOTE: the linker is looking in the target dir and linking on it apparently.
58+
set(CARGO_FEATURES "--no-default-features")
59+
60+
set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
61+
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
62+
set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
63+
set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})
64+
65+
set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
66+
endif()
67+
4368

4469
add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
4570
add_dependencies(${PROJECT_NAME} binaryninjaapi)
4671
get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
4772
list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
4873
find_package(BinaryNinjaCore REQUIRED)
4974

50-
set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
51-
5275
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
5376

5477
# Add the whole api to the depends too
@@ -63,11 +86,21 @@ set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
6386
if(APPLE)
6487
if(UNIVERSAL)
6588
if(CMAKE_BUILD_TYPE MATCHES Debug)
66-
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
67-
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
89+
if(DEMO)
90+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
91+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
92+
else()
93+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
94+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
95+
endif()
6896
else()
69-
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
70-
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
97+
if(DEMO)
98+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
99+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
100+
else()
101+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
102+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
103+
endif()
71104
endif()
72105

73106
add_custom_command(
@@ -89,12 +122,6 @@ if(APPLE)
89122
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
90123
)
91124
else()
92-
if(CMAKE_BUILD_TYPE MATCHES Debug)
93-
set(LIB_PATH ${PROJECT_BINARY_DIR}/target/debug/${OUTPUT_FILE_NAME})
94-
else()
95-
set(LIB_PATH ${PROJECT_BINARY_DIR}/target/release/${OUTPUT_FILE_NAME})
96-
endif()
97-
98125
add_custom_command(
99126
OUTPUT ${OUTPUT_FILE_PATH}
100127
COMMAND ${CMAKE_COMMAND} -E env
@@ -103,21 +130,32 @@ if(APPLE)
103130
COMMAND ${CMAKE_COMMAND} -E env
104131
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
105132
${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
106-
COMMAND ${CMAKE_COMMAND} -E copy ${LIB_PATH} ${OUTPUT_FILE_PATH}
133+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
107134
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
108135
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
109136
)
110137
endif()
111138
elseif(WIN32)
112-
add_custom_command(
113-
OUTPUT ${OUTPUT_FILE_PATH}
114-
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
115-
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
116-
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
117-
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
118-
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
119-
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
120-
)
139+
if(DEMO)
140+
add_custom_command(
141+
OUTPUT ${OUTPUT_FILE_PATH}
142+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS}
143+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
144+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
145+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
146+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
147+
)
148+
else()
149+
add_custom_command(
150+
OUTPUT ${OUTPUT_FILE_PATH}
151+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
152+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
153+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
154+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
155+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
156+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
157+
)
158+
endif()
121159
else()
122160
add_custom_command(
123161
OUTPUT ${OUTPUT_FILE_PATH}

plugins/svd/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@ log = "0.4"
1515
serde_json = "1.0"
1616

1717
[dev-dependencies]
18-
insta = { version = "1.42", features = ["yaml"] }
18+
insta = { version = "1.42", features = ["yaml"] }
19+
20+
[features]
21+
demo = []

plugins/svd/demo/Cargo.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[package]
2+
name = "svd_ninja-static"
3+
version = "0.1.0"
4+
edition = "2021"
5+
license = "Apache-2.0"
6+
7+
[lib]
8+
crate-type = ["staticlib", "lib"]
9+
path = "../src/lib.rs"
10+
11+
[dependencies]
12+
binaryninja = { workspace = true, features = ["demo"]}
13+
binaryninjacore-sys.workspace = true
14+
svd-parser = { version = "0.14.8", features = ["expand"] }
15+
log = "0.4"
16+
serde_json = "1.0"
17+
18+
[dev-dependencies]
19+
insta = { version = "1.42", features = ["yaml"] }
20+
21+
[features]
22+
demo = []

plugins/svd/demo/build.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use std::path::PathBuf;
2+
3+
fn main() {
4+
let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
5+
.expect("DEP_BINARYNINJACORE_PATH not specified");
6+
7+
println!("cargo::rustc-link-lib=dylib=binaryninjacore");
8+
println!("cargo::rustc-link-search={}", link_path.to_str().unwrap());
9+
10+
#[cfg(not(target_os = "windows"))]
11+
{
12+
println!(
13+
"cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
14+
link_path.to_string_lossy()
15+
);
16+
}
17+
18+
let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR specified");
19+
let out_dir_path = PathBuf::from(out_dir);
20+
21+
// Copy all binaries to OUT_DIR for unit tests.
22+
let bin_dir: PathBuf = "fixtures/".into();
23+
if let Ok(entries) = std::fs::read_dir(bin_dir) {
24+
for entry in entries {
25+
let entry = entry.unwrap();
26+
let path = entry.path();
27+
if path.is_file() {
28+
let file_name = path.file_name().unwrap();
29+
let dest_path = out_dir_path.join(file_name);
30+
std::fs::copy(&path, &dest_path).expect("failed to copy binary to OUT_DIR");
31+
}
32+
}
33+
}
34+
}

plugins/svd/src/lib.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,21 @@ impl Command for LoadSVDFile {
6060

6161
#[no_mangle]
6262
#[allow(non_snake_case)]
63+
#[cfg(not(feature = "demo"))]
6364
pub extern "C" fn CorePluginInit() -> bool {
65+
plugin_init();
66+
true
67+
}
68+
69+
#[no_mangle]
70+
#[allow(non_snake_case)]
71+
#[cfg(feature = "demo")]
72+
pub extern "C" fn SVDPluginInit() -> bool {
73+
plugin_init();
74+
true
75+
}
76+
77+
fn plugin_init() {
6478
Logger::new("SVD").with_level(LevelFilter::Debug).init();
6579

6680
binaryninja::command::register_command(
@@ -107,6 +121,4 @@ pub extern "C" fn CorePluginInit() -> bool {
107121
.unwrap();
108122
module_meta_workflow.insert("core.module.loadDebugInfo", [LOADER_ACTIVITY_NAME]);
109123
module_meta_workflow.register().unwrap();
110-
111-
true
112-
}
124+
}

0 commit comments

Comments
 (0)