1 use std::os::raw::c_int; 2 3 /// Perform lazy binding. 4 /// 5 /// Relocations shall be performed at an implementation-defined time, ranging from the time 6 /// of the [`Library::open`] call until the first reference to a given symbol occurs. 7 /// Specifying `RTLD_LAZY` should improve performance on implementations supporting dynamic 8 /// symbol binding since a process might not reference all of the symbols in an executable 9 /// object file. And, for systems supporting dynamic symbol resolution for normal process 10 /// execution, this behaviour mimics the normal handling of process execution. 11 /// 12 /// Conflicts with [`RTLD_NOW`]. 13 /// 14 /// [`Library::open`]: crate::os::unix::Library::open 15 pub const RTLD_LAZY: c_int = posix::RTLD_LAZY; 16 17 /// Perform eager binding. 18 /// 19 /// All necessary relocations shall be performed when the executable object file is first 20 /// loaded. This may waste some processing if relocations are performed for symbols 21 /// that are never referenced. This behaviour may be useful for applications that need to 22 /// know that all symbols referenced during execution will be available before 23 /// [`Library::open`] returns. 24 /// 25 /// Conflicts with [`RTLD_LAZY`]. 26 /// 27 /// [`Library::open`]: crate::os::unix::Library::open 28 pub const RTLD_NOW: c_int = posix::RTLD_NOW; 29 30 /// Make loaded symbols available for resolution globally. 31 /// 32 /// The executable object file's symbols shall be made available for relocation processing of any 33 /// other executable object file. In addition, calls to [`Library::get`] on `Library` obtained from 34 /// [`Library::this`] allows executable object files loaded with this mode to be searched. 35 /// 36 /// [`Library::this`]: crate::os::unix::Library::this 37 /// [`Library::get`]: crate::os::unix::Library::get 38 pub const RTLD_GLOBAL: c_int = posix::RTLD_GLOBAL; 39 40 /// Load symbols into an isolated namespace. 41 /// 42 /// The executable object file's symbols shall not be made available for relocation processing of 43 /// any other executable object file. This mode of operation is most appropriate for e.g. plugins. 44 pub const RTLD_LOCAL: c_int = posix::RTLD_LOCAL; 45 46 #[cfg(all(libloading_docs, not(unix)))] 47 mod posix { 48 use super::c_int; 49 pub(super) const RTLD_LAZY: c_int = !0; 50 pub(super) const RTLD_NOW: c_int = !0; 51 pub(super) const RTLD_GLOBAL: c_int = !0; 52 pub(super) const RTLD_LOCAL: c_int = !0; 53 } 54 55 #[cfg(any(not(libloading_docs), unix))] 56 mod posix { 57 extern crate cfg_if; 58 use self::cfg_if::cfg_if; 59 use super::c_int; 60 cfg_if! { 61 if #[cfg(target_os = "haiku")] { 62 pub(super) const RTLD_LAZY: c_int = 0; 63 } else if #[cfg(target_os = "aix")] { 64 pub(super) const RTLD_LAZY: c_int = 4; 65 } else if #[cfg(any( 66 target_os = "linux", 67 target_os = "android", 68 target_os = "emscripten", 69 70 target_os = "macos", 71 target_os = "ios", 72 target_os = "freebsd", 73 target_os = "dragonfly", 74 target_os = "openbsd", 75 target_os = "netbsd", 76 77 target_os = "solaris", 78 target_os = "illumos", 79 80 target_env = "uclibc", 81 target_env = "newlib", 82 83 target_os = "fuchsia", 84 target_os = "redox", 85 target_os = "nto", 86 target_os = "hurd", 87 ))] { 88 pub(super) const RTLD_LAZY: c_int = 1; 89 } else { 90 compile_error!( 91 "Target has no known `RTLD_LAZY` value. Please submit an issue or PR adding it." 92 ); 93 } 94 } 95 96 cfg_if! { 97 if #[cfg(target_os = "haiku")] { 98 pub(super) const RTLD_NOW: c_int = 1; 99 } else if #[cfg(any( 100 target_os = "linux", 101 all(target_os = "android", target_pointer_width = "64"), 102 target_os = "emscripten", 103 104 target_os = "macos", 105 target_os = "ios", 106 target_os = "freebsd", 107 target_os = "dragonfly", 108 target_os = "openbsd", 109 target_os = "netbsd", 110 111 target_os = "aix", 112 target_os = "solaris", 113 target_os = "illumos", 114 115 target_env = "uclibc", 116 target_env = "newlib", 117 118 target_os = "fuchsia", 119 target_os = "redox", 120 target_os = "nto", 121 target_os = "hurd", 122 ))] { 123 pub(super) const RTLD_NOW: c_int = 2; 124 } else if #[cfg(all(target_os = "android",target_pointer_width = "32"))] { 125 pub(super) const RTLD_NOW: c_int = 0; 126 } else { 127 compile_error!( 128 "Target has no known `RTLD_NOW` value. Please submit an issue or PR adding it." 129 ); 130 } 131 } 132 133 cfg_if! { 134 if #[cfg(any( 135 target_os = "haiku", 136 all(target_os = "android",target_pointer_width = "32"), 137 ))] { 138 pub(super) const RTLD_GLOBAL: c_int = 2; 139 } else if #[cfg(target_os = "aix")] { 140 pub(super) const RTLD_GLOBAL: c_int = 0x10000; 141 } else if #[cfg(any( 142 target_env = "uclibc", 143 all(target_os = "linux", target_arch = "mips"), 144 all(target_os = "linux", target_arch = "mips64"), 145 ))] { 146 pub(super) const RTLD_GLOBAL: c_int = 4; 147 } else if #[cfg(any( 148 target_os = "macos", 149 target_os = "ios", 150 ))] { 151 pub(super) const RTLD_GLOBAL: c_int = 8; 152 } else if #[cfg(any( 153 target_os = "linux", 154 all(target_os = "android", target_pointer_width = "64"), 155 target_os = "emscripten", 156 157 target_os = "freebsd", 158 target_os = "dragonfly", 159 target_os = "openbsd", 160 target_os = "netbsd", 161 162 target_os = "solaris", 163 target_os = "illumos", 164 165 target_env = "newlib", 166 167 target_os = "fuchsia", 168 target_os = "redox", 169 target_os = "nto", 170 target_os = "hurd", 171 ))] { 172 pub(super) const RTLD_GLOBAL: c_int = 0x100; 173 } else { 174 compile_error!( 175 "Target has no known `RTLD_GLOBAL` value. Please submit an issue or PR adding it." 176 ); 177 } 178 } 179 180 cfg_if! { 181 if #[cfg(any( 182 target_os = "netbsd", 183 target_os = "nto", 184 ))] { 185 pub(super) const RTLD_LOCAL: c_int = 0x200; 186 } else if #[cfg(target_os = "aix")] { 187 pub(super) const RTLD_LOCAL: c_int = 0x80000; 188 } else if #[cfg(any( 189 target_os = "macos", 190 target_os = "ios", 191 ))] { 192 pub(super) const RTLD_LOCAL: c_int = 4; 193 } else if #[cfg(any( 194 target_os = "linux", 195 target_os = "android", 196 target_os = "emscripten", 197 198 target_os = "freebsd", 199 target_os = "dragonfly", 200 target_os = "openbsd", 201 202 target_os = "haiku", 203 204 target_os = "solaris", 205 target_os = "illumos", 206 207 target_env = "uclibc", 208 target_env = "newlib", 209 210 target_os = "fuchsia", 211 target_os = "redox", 212 target_os = "hurd", 213 ))] { 214 pub(super) const RTLD_LOCAL: c_int = 0; 215 } else { 216 compile_error!( 217 "Target has no known `RTLD_LOCAL` value. Please submit an issue or PR adding it." 218 ); 219 } 220 } 221 } 222 223 // Other constants that exist but are not bound because they are platform-specific (non-posix) 224 // extensions. Some of these constants are only relevant to `dlsym` or `dlmopen` calls. 225 // 226 // RTLD_CONFGEN 227 // RTLD_DEFAULT 228 // RTLD_DI_CONFIGADDR 229 // RTLD_DI_LINKMAP 230 // RTLD_DI_LMID 231 // RTLD_DI_ORIGIN 232 // RTLD_DI_PROFILENAME 233 // RTLD_DI_PROFILEOUT 234 // RTLD_DI_SERINFO 235 // RTLD_DI_SERINFOSIZE 236 // RTLD_DI_TLS_DATA 237 // RTLD_DI_TLS_MODID 238 // RTLD_FIRST 239 // RTLD_GROUP 240 // RTLD_NEXT 241 // RTLD_PARENT 242 // RTLD_PROBE 243 // RTLD_SELF 244 // RTLD_WORLD 245 // RTLD_NODELETE 246 // RTLD_NOLOAD 247 // RTLD_DEEPBIND 248