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 | |