Skip to content

Commit 8200142

Browse files
committed
Add IDB import to free. Fix Vector35/binaryninja#1497
1 parent 032b5d6 commit 8200142

7 files changed

Lines changed: 160 additions & 42 deletions

File tree

Cargo.lock

Lines changed: 13 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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ members = [
1616
"plugins/dwarf/dwarfdump",
1717
"plugins/dwarf/shared",
1818
"plugins/idb_import",
19+
"plugins/idb_import/demo",
1920
"plugins/pdb-ng",
2021
"plugins/pdb-ng/demo",
2122
"plugins/svd",

plugins/idb_import/CMakeLists.txt

Lines changed: 83 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,77 +15,118 @@ file(GLOB API_SOURCES CONFIGURE_DEPENDS
1515
${PROJECT_SOURCE_DIR}/../../rust/src/*/*.rs)
1616

1717
if(CMAKE_BUILD_TYPE MATCHES Debug)
18-
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
19-
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
18+
if(DEMO)
19+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
20+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
21+
else()
22+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
23+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
24+
endif()
25+
else()
26+
if(DEMO)
27+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
28+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
29+
else()
30+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
31+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
32+
endif()
33+
endif()
34+
35+
if(DEMO)
36+
set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)
37+
38+
set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
39+
set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
40+
set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
41+
set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})
42+
43+
set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
2044
else()
21-
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
22-
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
23-
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}idb_import.pdb)
45+
set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
46+
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
47+
set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
48+
set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})
49+
50+
set(BINJA_LIB_DIR ${BN_CORE_OUTPUT_DIR})
2451
endif()
2552

26-
set(OUTPUT_FILE ${CMAKE_STATIC_LIBRARY_PREFIX}idb_import${CMAKE_SHARED_LIBRARY_SUFFIX})
27-
set(PLUGIN_PATH ${TARGET_DIR}/${OUTPUT_FILE})
2853

29-
add_custom_target(idb_import ALL DEPENDS ${PLUGIN_PATH})
30-
add_dependencies(idb_import binaryninjaapi)
54+
add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
55+
add_dependencies(${PROJECT_NAME} binaryninjaapi)
56+
57+
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
3158

3259
find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
3360
if(CARGO_API_VERSION)
34-
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_API_VERSION} cargo build)
61+
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_API_VERSION} cargo)
3562
else()
36-
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo build)
63+
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)
3764
endif()
3865

3966
if(APPLE)
4067
if(UNIVERSAL)
4168
if(CMAKE_BUILD_TYPE MATCHES Debug)
42-
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE})
43-
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE})
69+
if(DEMO)
70+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
71+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
72+
else()
73+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
74+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
75+
endif()
4476
else()
45-
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE})
46-
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE})
77+
if(DEMO)
78+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
79+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
80+
else()
81+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
82+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
83+
endif()
4784
endif()
4885

4986
add_custom_command(
50-
OUTPUT ${PLUGIN_PATH}
87+
OUTPUT ${OUTPUT_FILE_PATH}
5188
COMMAND ${CMAKE_COMMAND} -E env
52-
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR}
53-
${RUSTUP_COMMAND} --target=aarch64-apple-darwin ${CARGO_OPTS}
89+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
90+
${RUSTUP_COMMAND} build --target=aarch64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
5491
COMMAND ${CMAKE_COMMAND} -E env
55-
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR}
56-
${RUSTUP_COMMAND} --target=x86_64-apple-darwin ${CARGO_OPTS}
92+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
93+
${RUSTUP_COMMAND} build --target=x86_64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
5794
COMMAND mkdir -p ${TARGET_DIR}
58-
COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${PLUGIN_PATH}
59-
COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
95+
COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${OUTPUT_FILE_PATH}
6096
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
6197
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
6298
else()
63-
if(CMAKE_BUILD_TYPE MATCHES Debug)
64-
set(LIB_PATH ${PROJECT_BINARY_DIR}/target/debug/${OUTPUT_FILE})
65-
else()
66-
set(LIB_PATH ${PROJECT_BINARY_DIR}/target/release/${OUTPUT_FILE})
67-
endif()
68-
6999
add_custom_command(
70-
OUTPUT ${PLUGIN_PATH}
71-
COMMAND ${CMAKE_COMMAND} -E env MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
72-
COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
100+
OUTPUT ${OUTPUT_FILE_PATH}
101+
COMMAND ${CMAKE_COMMAND} -E env
102+
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
103+
${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
104+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
73105
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
74106
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
75107
endif()
76108
elseif(WIN32)
77-
add_custom_command(
78-
OUTPUT ${PLUGIN_PATH}
79-
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
80-
COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
81-
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${BN_CORE_PLUGIN_DIR}
82-
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
83-
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
109+
if(DEMO)
110+
add_custom_command(
111+
OUTPUT ${OUTPUT_FILE_PATH}
112+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
113+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
114+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
115+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
116+
else()
117+
add_custom_command(
118+
OUTPUT ${OUTPUT_FILE_PATH}
119+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
120+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
121+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
122+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
123+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
124+
endif()
84125
else()
85126
add_custom_command(
86-
OUTPUT ${PLUGIN_PATH}
87-
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BN_CORE_OUTPUT_DIR} ${RUSTUP_COMMAND} ${CARGO_OPTS}
88-
COMMAND ${CMAKE_COMMAND} -E copy ${PLUGIN_PATH} ${BN_CORE_PLUGIN_DIR}
127+
OUTPUT ${OUTPUT_FILE_PATH}
128+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
129+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
89130
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
90131
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES})
91-
endif()
132+
endif()

plugins/idb_import/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ publish = false
99
[lib]
1010
crate-type = ["cdylib"]
1111

12+
[features]
13+
demo = []
14+
1215
[dependencies]
1316
anyhow = { version = "1.0.86", features = ["backtrace"] }
1417
binaryninja.workspace = true

plugins/idb_import/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 = "idb_import-static"
3+
version = "0.1.0"
4+
edition = "2021"
5+
license = "Apache-2.0"
6+
publish = false
7+
8+
[lib]
9+
crate-type = ["staticlib"]
10+
path = "../src/lib.rs"
11+
12+
[features]
13+
demo = []
14+
15+
[dependencies]
16+
anyhow = { version = "1.0.86", features = ["backtrace"] }
17+
binaryninja = { workspace = true, features = ["demo"] }
18+
binaryninjacore-sys.workspace = true
19+
idb-rs = { git = "https://github.com/Vector35/idb-rs", tag = "0.1.13" }
20+
tracing = "0.1"
21+
serde = { version = "1.0", features = ["derive"] }
22+
serde_json = "1.0"

plugins/idb_import/demo/build.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
fn main() {
2+
let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
3+
.expect("DEP_BINARYNINJACORE_PATH not specified");
4+
5+
println!("cargo::rustc-link-lib=dylib=binaryninjacore");
6+
println!(
7+
"cargo::rustc-link-search={}",
8+
link_path
9+
.to_str()
10+
.expect("Failed to convert link path to string")
11+
);
12+
13+
#[cfg(target_os = "linux")]
14+
{
15+
println!(
16+
"cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
17+
link_path.to_string_lossy()
18+
);
19+
}
20+
21+
#[cfg(target_os = "macos")]
22+
{
23+
let crate_name = std::env::var("CARGO_PKG_NAME").expect("CARGO_PKG_NAME not set");
24+
let lib_name = crate_name.replace('-', "_");
25+
println!(
26+
"cargo::rustc-link-arg=-Wl,-install_name,@rpath/lib{}.dylib",
27+
lib_name
28+
);
29+
}
30+
}

plugins/idb_import/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,16 @@ fn plugin_init() -> Result<(), ()> {
6363
Ok(())
6464
}
6565

66+
#[cfg(not(feature = "demo"))]
6667
#[allow(non_snake_case)]
6768
#[no_mangle]
6869
pub extern "C" fn CorePluginInit() -> bool {
6970
plugin_init().is_ok()
7071
}
72+
73+
#[cfg(feature = "demo")]
74+
#[allow(non_snake_case)]
75+
#[no_mangle]
76+
pub extern "C" fn IdbImportPluginInit() -> bool {
77+
plugin_init().is_ok()
78+
}

0 commit comments

Comments
 (0)