Rust 创建并编译一个可供 C 或其他语言调用的动态链接库
前言
最近在搞hook,正好看到这例子。于是就有了下文,使用rust 编写动态链接库,供c、c++ 语言调用。仅供参考。
// src/lib.rs
// 禁止编译器改名,使用 C 调用约定
#[no_mangle]
pub extern "C" fn hello() {// println!("Hello from Rust .so!");
}#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {a + b
}
[package]
name = "pcrust"
version = "0.1.0"
edition = "2021"[lib]
crate-type= ["cdylib"][dependencies]
libc = "0.2"
ctor = "0.1"
once_cell = "1.17"
simple_logger = "1.11"
log = "0.4"
创建c文件
#include <stdio.h>//
void hello(void);
int add(int a, int b);int main() {hello();printf("3 + 4 = %d\n", add(3, 4));return 0;
}
连接生成的库文件 , 调用成功
bruce@bruce-Inspiron-3910:/data/pcrust$ gcc test.c -L target/release -lpcrust -o test
bruce@bruce-Inspiron-3910:/data/pcrust$ ls
Cargo.lock Cargo.toml src target test test.c
bruce@bruce-Inspiron-3910:/data/pcrust$ ./test
./test: error while loading shared libraries: libpcrust.so: cannot open shared object file: No such file or directory
bruce@bruce-Inspiron-3910:/data/pcrust$ LD_LIBRARY_PATH=./target/release ./test
Hello from Rust .so!
3 + 4 = 7
说明:
gcc test.c \
-L target/release \ # 库文件所在目录
-lpcrust \ # 链接 libpcrust.so
-o test