37 lines
1.0 KiB
Rust
37 lines
1.0 KiB
Rust
use std::{ffi::c_void, ffi::CString, os::raw::c_char, os::raw::c_int};
|
|
|
|
#[link(name = "dl")]
|
|
extern "C" {
|
|
fn dlopen(path: *const c_char, flags: c_int) -> *const c_void;
|
|
fn dlsym(handle: *const c_void, name: *const c_char) -> *const c_void;
|
|
fn dlclose(handle: *const c_void);
|
|
}
|
|
|
|
// had to look that one up in `dlfcn.h`
|
|
// in C, it's a #define. in Rust, it's a proper constant
|
|
pub const RTLD_LAZY: c_int = 0x00001;
|
|
|
|
fn main() {
|
|
let lib_name = CString::new("../libgreet.so").unwrap();
|
|
let lib = unsafe { dlopen(lib_name.as_ptr(), RTLD_LAZY) };
|
|
if lib.is_null() {
|
|
panic!("could not open library");
|
|
}
|
|
|
|
let greet_name = CString::new("greet").unwrap();
|
|
let greet = unsafe { dlsym(lib, greet_name.as_ptr()) };
|
|
|
|
type Greet = unsafe extern "C" fn(name: *const c_char);
|
|
use std::mem::transmute;
|
|
let greet: Greet = unsafe { transmute(greet) };
|
|
|
|
let name = CString::new("fresh coffee").unwrap();
|
|
unsafe {
|
|
greet(name.as_ptr());
|
|
}
|
|
|
|
unsafe {
|
|
dlclose(lib);
|
|
}
|
|
}
|