|
@@ -40,10 +40,11 @@ pub unsafe extern "C" fn dlopen(cfilename: *const c_char, flags: c_int) -> *mut
|
|
//TODO support all sort of flags
|
|
//TODO support all sort of flags
|
|
|
|
|
|
let filename = if cfilename.is_null() {
|
|
let filename = if cfilename.is_null() {
|
|
- ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
|
|
- return ptr::null_mut();
|
|
|
|
|
|
+ None
|
|
} else {
|
|
} else {
|
|
- str::from_utf8_unchecked(CStr::from_ptr(cfilename).to_bytes())
|
|
|
|
|
|
+ Some(str::from_utf8_unchecked(
|
|
|
|
+ CStr::from_ptr(cfilename).to_bytes(),
|
|
|
|
+ ))
|
|
};
|
|
};
|
|
|
|
|
|
let tcb = match Tcb::current() {
|
|
let tcb = match Tcb::current() {
|
|
@@ -60,31 +61,34 @@ pub unsafe extern "C" fn dlopen(cfilename: *const c_char, flags: c_int) -> *mut
|
|
return ptr::null_mut();
|
|
return ptr::null_mut();
|
|
}
|
|
}
|
|
let mut linker = (&*tcb.linker_ptr).lock();
|
|
let mut linker = (&*tcb.linker_ptr).lock();
|
|
|
|
+
|
|
let cbs_c = linker.cbs.clone();
|
|
let cbs_c = linker.cbs.clone();
|
|
let cbs = cbs_c.borrow();
|
|
let cbs = cbs_c.borrow();
|
|
|
|
|
|
let id = match (cbs.load_library)(&mut linker, filename) {
|
|
let id = match (cbs.load_library)(&mut linker, filename) {
|
|
Err(err) => {
|
|
Err(err) => {
|
|
- eprintln!("dlopen: failed to load {}", filename);
|
|
|
|
|
|
+ eprintln!("dlopen: failed to load {:?}", filename);
|
|
ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
return ptr::null_mut();
|
|
return ptr::null_mut();
|
|
}
|
|
}
|
|
Ok(id) => id,
|
|
Ok(id) => id,
|
|
};
|
|
};
|
|
|
|
|
|
- if let Err(err) = (cbs.link)(&mut linker, None, None, Some(id)) {
|
|
|
|
- (cbs.unload)(&mut linker, id);
|
|
|
|
- eprintln!("dlopen: failed to link '{}': {}", filename, err);
|
|
|
|
- ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
|
|
- return ptr::null_mut();
|
|
|
|
- };
|
|
|
|
|
|
+ if let Some(fname) = filename {
|
|
|
|
+ if let Err(err) = (cbs.link)(&mut linker, None, None, Some(id)) {
|
|
|
|
+ (cbs.unload)(&mut linker, id);
|
|
|
|
+ eprintln!("dlopen: failed to link '{}': {}", fname, err);
|
|
|
|
+ ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
|
|
+ return ptr::null_mut();
|
|
|
|
+ };
|
|
|
|
|
|
- if let Err(err) = (cbs.run_init)(&mut linker, Some(id)) {
|
|
|
|
- (cbs.unload)(&mut linker, id);
|
|
|
|
- eprintln!("dlopen: failed to link '{}': {}", filename, err);
|
|
|
|
- ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
|
|
- return ptr::null_mut();
|
|
|
|
- };
|
|
|
|
|
|
+ if let Err(err) = (cbs.run_init)(&mut linker, Some(id)) {
|
|
|
|
+ (cbs.unload)(&mut linker, id);
|
|
|
|
+ eprintln!("dlopen: failed to link '{}': {}", fname, err);
|
|
|
|
+ ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
|
|
|
|
+ return ptr::null_mut();
|
|
|
|
+ };
|
|
|
|
+ }
|
|
id as *mut c_void
|
|
id as *mut c_void
|
|
}
|
|
}
|
|
|
|
|