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 ))] { 86 pub(super) const RTLD_LAZY: c_int = 1; 87 } else { 88 compile_error!( 89 "Target has no known `RTLD_LAZY` value. Please submit an issue or PR adding it." 90 ); 91 } 92 } 93 94 cfg_if! { 95 if #[cfg(target_os = "haiku")] { 96 pub(super) const RTLD_NOW: c_int = 1; 97 } else if #[cfg(any( 98 target_os = "linux", 99 all(target_os = "android", target_pointer_width = "64"), 100 target_os = "emscripten", 101 102 target_os = "macos", 103 target_os = "ios", 104 target_os = "freebsd", 105 target_os = "dragonfly", 106 target_os = "openbsd", 107 target_os = "netbsd", 108 109 target_os = "aix", 110 target_os = "solaris", 111 target_os = "illumos", 112 113 target_env = "uclibc", 114 target_env = "newlib", 115 116 target_os = "fuchsia", 117 target_os = "redox", 118 ))] { 119 pub(super) const RTLD_NOW: c_int = 2; 120 } else if #[cfg(all(target_os = "android",target_pointer_width = "32"))] { 121 pub(super) const RTLD_NOW: c_int = 0; 122 } else { 123 compile_error!( 124 "Target has no known `RTLD_NOW` value. Please submit an issue or PR adding it." 125 ); 126 } 127 } 128 129 cfg_if! { 130 if #[cfg(any( 131 target_os = "haiku", 132 all(target_os = "android",target_pointer_width = "32"), 133 ))] { 134 pub(super) const RTLD_GLOBAL: c_int = 2; 135 } else if #[cfg(target_os = "aix")] { 136 pub(super) const RTLD_GLOBAL: c_int = 0x10000; 137 } else if #[cfg(any( 138 target_env = "uclibc", 139 all(target_os = "linux", target_arch = "mips"), 140 all(target_os = "linux", target_arch = "mips64"), 141 ))] { 142 pub(super) const RTLD_GLOBAL: c_int = 4; 143 } else if #[cfg(any( 144 target_os = "macos", 145 target_os = "ios", 146 ))] { 147 pub(super) const RTLD_GLOBAL: c_int = 8; 148 } else if #[cfg(any( 149 target_os = "linux", 150 all(target_os = "android", target_pointer_width = "64"), 151 target_os = "emscripten", 152 153 target_os = "freebsd", 154 target_os = "dragonfly", 155 target_os = "openbsd", 156 target_os = "netbsd", 157 158 target_os = "solaris", 159 target_os = "illumos", 160 161 target_env = "newlib", 162 163 target_os = "fuchsia", 164 target_os = "redox", 165 ))] { 166 pub(super) const RTLD_GLOBAL: c_int = 0x100; 167 } else { 168 compile_error!( 169 "Target has no known `RTLD_GLOBAL` value. Please submit an issue or PR adding it." 170 ); 171 } 172 } 173 174 cfg_if! { 175 if #[cfg(target_os = "netbsd")] { 176 pub(super) const RTLD_LOCAL: c_int = 0x200; 177 } else if #[cfg(target_os = "aix")] { 178 pub(super) const RTLD_LOCAL: c_int = 0x80000; 179 } else if #[cfg(any( 180 target_os = "macos", 181 target_os = "ios", 182 ))] { 183 pub(super) const RTLD_LOCAL: c_int = 4; 184 } else if #[cfg(any( 185 target_os = "linux", 186 target_os = "android", 187 target_os = "emscripten", 188 189 target_os = "freebsd", 190 target_os = "dragonfly", 191 target_os = "openbsd", 192 193 target_os = "haiku", 194 195 target_os = "solaris", 196 target_os = "illumos", 197 198 target_env = "uclibc", 199 target_env = "newlib", 200 201 target_os = "fuchsia", 202 target_os = "redox", 203 ))] { 204 pub(super) const RTLD_LOCAL: c_int = 0; 205 } else { 206 compile_error!( 207 "Target has no known `RTLD_LOCAL` value. Please submit an issue or PR adding it." 208 ); 209 } 210 } 211 } 212 213 // Other constants that exist but are not bound because they are platform-specific (non-posix) 214 // extensions. Some of these constants are only relevant to `dlsym` or `dlmopen` calls. 215 // 216 // RTLD_CONFGEN 217 // RTLD_DEFAULT 218 // RTLD_DI_CONFIGADDR 219 // RTLD_DI_LINKMAP 220 // RTLD_DI_LMID 221 // RTLD_DI_ORIGIN 222 // RTLD_DI_PROFILENAME 223 // RTLD_DI_PROFILEOUT 224 // RTLD_DI_SERINFO 225 // RTLD_DI_SERINFOSIZE 226 // RTLD_DI_TLS_DATA 227 // RTLD_DI_TLS_MODID 228 // RTLD_FIRST 229 // RTLD_GROUP 230 // RTLD_NEXT 231 // RTLD_PARENT 232 // RTLD_PROBE 233 // RTLD_SELF 234 // RTLD_WORLD 235 // RTLD_NODELETE 236 // RTLD_NOLOAD 237 // RTLD_DEEPBIND 238