• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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