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