Skip to content

Commit 556d6b7

Browse files
committed
Add SVD Loader Plugin
1 parent 7648cdd commit 556d6b7

File tree

16 files changed

+34645
-4
lines changed

16 files changed

+34645
-4
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ members = [
1616
"plugins/idb_import",
1717
"plugins/pdb-ng",
1818
"plugins/pdb-ng/demo",
19-
"plugins/warp"
19+
"plugins/warp",
20+
"plugins/svd"
2021
]
2122

2223
[workspace.dependencies]
@@ -35,4 +36,4 @@ lto = false
3536
# Disable LTO on demo builds, it will export `rust_eh_personality`
3637
[profile.dev-demo]
3738
inherits = "dev"
38-
lto = false
39+
lto = false

plugins/svd/CMakeLists.txt

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
2+
3+
project(svd_ninja)
4+
5+
if(NOT BN_API_BUILD_EXAMPLES AND NOT BN_INTERNAL_BUILD)
6+
if(NOT BN_API_PATH)
7+
# If we have not already defined the API source directory try and find it.
8+
find_path(
9+
BN_API_PATH
10+
NAMES binaryninjaapi.h
11+
# List of paths to search for the clone of the api
12+
HINTS ../../.. ../../binaryninja/api/ binaryninjaapi binaryninja-api $ENV{BN_API_PATH}
13+
REQUIRED
14+
)
15+
endif()
16+
set(CARGO_STABLE_VERSION 1.83.0)
17+
add_subdirectory(${BN_API_PATH} binaryninjaapi)
18+
endif()
19+
20+
file(GLOB_RECURSE PLUGIN_SOURCES CONFIGURE_DEPENDS
21+
${PROJECT_SOURCE_DIR}/Cargo.toml
22+
${PROJECT_SOURCE_DIR}/src/*.rs)
23+
24+
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)
27+
else()
28+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
29+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
30+
endif()
31+
32+
if(FORCE_COLORED_OUTPUT)
33+
set(CARGO_OPTS ${CARGO_OPTS} --color always)
34+
endif()
35+
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)
43+
44+
add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
45+
add_dependencies(${PROJECT_NAME} binaryninjaapi)
46+
get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
47+
list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
48+
find_package(BinaryNinjaCore REQUIRED)
49+
50+
set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
51+
52+
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
53+
54+
# Add the whole api to the depends too
55+
file(GLOB_RECURSE API_SOURCES CONFIGURE_DEPENDS
56+
${BN_API_SOURCE_DIR}/binaryninjacore.h
57+
${BN_API_SOURCE_DIR}/rust/src/*.rs
58+
${BN_API_SOURCE_DIR}/rust/binaryninjacore-sys/src/*.rs)
59+
60+
find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
61+
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
62+
63+
if(APPLE)
64+
if(UNIVERSAL)
65+
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})
68+
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})
71+
endif()
72+
73+
add_custom_command(
74+
OUTPUT ${OUTPUT_FILE_PATH}
75+
COMMAND ${CMAKE_COMMAND} -E env
76+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
77+
${RUSTUP_COMMAND} clean --target=aarch64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
78+
COMMAND ${CMAKE_COMMAND} -E env
79+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
80+
${RUSTUP_COMMAND} clean --target=x86_64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
81+
COMMAND ${CMAKE_COMMAND} -E env
82+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
83+
${RUSTUP_COMMAND} build --target=aarch64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
84+
COMMAND ${CMAKE_COMMAND} -E env
85+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
86+
${RUSTUP_COMMAND} build --target=x86_64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
87+
COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${OUTPUT_FILE_PATH}
88+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
89+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
90+
)
91+
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+
98+
add_custom_command(
99+
OUTPUT ${OUTPUT_FILE_PATH}
100+
COMMAND ${CMAKE_COMMAND} -E env
101+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
102+
${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
103+
COMMAND ${CMAKE_COMMAND} -E env
104+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
105+
${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
106+
COMMAND ${CMAKE_COMMAND} -E copy ${LIB_PATH} ${OUTPUT_FILE_PATH}
107+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
108+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
109+
)
110+
endif()
111+
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+
)
121+
else()
122+
add_custom_command(
123+
OUTPUT ${OUTPUT_FILE_PATH}
124+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
125+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
126+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
127+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
128+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
129+
)
130+
endif()

plugins/svd/Cargo.toml

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

plugins/svd/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+
}

0 commit comments

Comments
 (0)