1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
extern crate libc;
use self::libc::{c_char, c_void};

const RTLD_NEXT: *const c_void = -1isize as *const c_void;

#[link(name="dl")]
extern {
    fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void;
}

pub unsafe fn dlsym_next(symbol: &'static str) -> Result<*const u8, String> {
    let ptr = dlsym(RTLD_NEXT, symbol.as_ptr() as *const c_char);
    if ptr.is_null() {
        Err(format!("Unable to find underlying function for {}", symbol))
    } else {
        Ok(ptr as *const u8)
    }
}