mod.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //! dlfcn implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/dlfcn.h.html
  2. use core::{ptr, str};
  3. use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
  4. use c_str::CStr;
  5. use platform::types::*;
  6. pub const RTLD_LAZY: c_int = 0x0001;
  7. pub const RTLD_NOW: c_int = 0x0002;
  8. pub const RTLD_GLOBAL: c_int = 0x0100;
  9. pub const RTLD_LOCAL: c_int = 0x0000;
  10. static ERROR_NOT_SUPPORTED: &'static CStr = c_str!("dlfcn not supported");
  11. #[thread_local]
  12. static ERROR: AtomicUsize = ATOMIC_USIZE_INIT;
  13. #[repr(C)]
  14. pub struct Dl_info {
  15. dli_fname: *const c_char,
  16. dli_fbase: *mut c_void,
  17. dli_sname: *const c_char,
  18. dli_saddr: *mut c_void,
  19. }
  20. #[no_mangle]
  21. pub unsafe extern "C" fn dladdr(addr: *mut c_void, info: *mut Dl_info) -> c_int {
  22. (*info).dli_fname = ptr::null();
  23. (*info).dli_fbase = ptr::null_mut();
  24. (*info).dli_sname = ptr::null();
  25. (*info).dli_saddr = ptr::null_mut();
  26. 0
  27. }
  28. #[no_mangle]
  29. pub unsafe extern "C" fn dlopen(filename: *const c_char, flags: c_int) -> *mut c_void {
  30. let filename_opt = if filename.is_null() {
  31. None
  32. } else {
  33. Some(str::from_utf8_unchecked(CStr::from_ptr(filename).to_bytes()))
  34. };
  35. eprintln!("dlopen({:?}, {:#>04x})", filename_opt, flags);
  36. if let Some(filename) = filename_opt {
  37. ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
  38. ptr::null_mut()
  39. } else {
  40. 1 as *mut c_void
  41. }
  42. }
  43. #[no_mangle]
  44. pub unsafe extern "C" fn dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void {
  45. let symbol_opt = if symbol.is_null() {
  46. None
  47. } else {
  48. Some(str::from_utf8_unchecked(CStr::from_ptr(symbol).to_bytes()))
  49. };
  50. eprintln!("dlsym({:p}, {:?})", handle, symbol_opt);
  51. ptr::null_mut()
  52. }
  53. #[no_mangle]
  54. pub extern "C" fn dlclose(handle: *mut c_void) -> c_int {
  55. 0
  56. }
  57. #[no_mangle]
  58. pub extern "C" fn dlerror() -> *mut c_char {
  59. ERROR.swap(0, Ordering::SeqCst) as *mut c_char
  60. }