1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- //! dlfcn implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/dlfcn.h.html
- use core::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
- use core::{ptr, str};
- use c_str::CStr;
- use platform::types::*;
- pub const RTLD_LAZY: c_int = 0x0001;
- pub const RTLD_NOW: c_int = 0x0002;
- pub const RTLD_GLOBAL: c_int = 0x0100;
- pub const RTLD_LOCAL: c_int = 0x0000;
- static ERROR_NOT_SUPPORTED: &'static CStr = c_str!("dlfcn not supported");
- #[thread_local]
- static ERROR: AtomicUsize = ATOMIC_USIZE_INIT;
- #[repr(C)]
- pub struct Dl_info {
- dli_fname: *const c_char,
- dli_fbase: *mut c_void,
- dli_sname: *const c_char,
- dli_saddr: *mut c_void,
- }
- #[no_mangle]
- pub unsafe extern "C" fn dladdr(addr: *mut c_void, info: *mut Dl_info) -> c_int {
- (*info).dli_fname = ptr::null();
- (*info).dli_fbase = ptr::null_mut();
- (*info).dli_sname = ptr::null();
- (*info).dli_saddr = ptr::null_mut();
- 0
- }
- #[no_mangle]
- pub unsafe extern "C" fn dlopen(filename: *const c_char, flags: c_int) -> *mut c_void {
- let filename_opt = if filename.is_null() {
- None
- } else {
- Some(str::from_utf8_unchecked(
- CStr::from_ptr(filename).to_bytes(),
- ))
- };
- eprintln!("dlopen({:?}, {:#>04x})", filename_opt, flags);
- if let Some(filename) = filename_opt {
- ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
- ptr::null_mut()
- } else {
- 1 as *mut c_void
- }
- }
- #[no_mangle]
- pub unsafe extern "C" fn dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void {
- let symbol_opt = if symbol.is_null() {
- None
- } else {
- Some(str::from_utf8_unchecked(CStr::from_ptr(symbol).to_bytes()))
- };
- eprintln!("dlsym({:p}, {:?})", handle, symbol_opt);
- ptr::null_mut()
- }
- #[no_mangle]
- pub extern "C" fn dlclose(handle: *mut c_void) -> c_int {
- 0
- }
- #[no_mangle]
- pub extern "C" fn dlerror() -> *mut c_char {
- ERROR.swap(0, Ordering::SeqCst) as *mut c_char
- }
|