Line data Source code
1 : use std::marker::PhantomData;
2 :
3 : use lief_ffi as ffi;
4 : pub mod atom_info;
5 : pub mod build_version;
6 : pub mod code_signature;
7 : pub mod code_signature_dir;
8 : pub mod data_in_code;
9 : pub mod dyld_chained_fixups;
10 : pub mod dyld_environment;
11 : pub mod dyld_export_trie;
12 : pub mod dyldinfo;
13 : pub mod dylib;
14 : pub mod dylinker;
15 : pub mod dynamic_symbol_command;
16 : pub mod encryption_info;
17 : pub mod fileset;
18 : pub mod function_variant_fixups;
19 : pub mod function_variants;
20 : pub mod functionstarts;
21 : pub mod linker_opt_hint;
22 : pub mod main_cmd;
23 : pub mod note;
24 : pub mod routine;
25 : pub mod rpath;
26 : pub mod segment;
27 : pub mod segment_split_info;
28 : pub mod source_version;
29 : pub mod sub_client;
30 : pub mod sub_framework;
31 : pub mod symbol_command;
32 : pub mod thread_command;
33 : pub mod two_level_hints;
34 : pub mod unknown;
35 : pub mod uuid;
36 : pub mod version_min;
37 :
38 : #[doc(inline)]
39 : pub use atom_info::AtomInfo;
40 : #[doc(inline)]
41 : pub use build_version::BuildVersion;
42 : #[doc(inline)]
43 : pub use code_signature::CodeSignature;
44 : #[doc(inline)]
45 : pub use code_signature_dir::CodeSignatureDir;
46 : #[doc(inline)]
47 : pub use data_in_code::DataInCode;
48 : #[doc(inline)]
49 : pub use dyld_chained_fixups::DyldChainedFixups;
50 : #[doc(inline)]
51 : pub use dyld_environment::DyldEnvironment;
52 : #[doc(inline)]
53 : pub use dyld_export_trie::DyldExportsTrie;
54 : #[doc(inline)]
55 : pub use dyldinfo::DyldInfo;
56 : #[doc(inline)]
57 : pub use dylib::{Dylib, Libraries};
58 : #[doc(inline)]
59 : pub use dylinker::Dylinker;
60 : #[doc(inline)]
61 : pub use dynamic_symbol_command::DynamicSymbolCommand;
62 : #[doc(inline)]
63 : pub use encryption_info::EncryptionInfo;
64 : #[doc(inline)]
65 : pub use fileset::Fileset;
66 : #[doc(inline)]
67 : pub use function_variant_fixups::FunctionVariantFixups;
68 : #[doc(inline)]
69 : pub use function_variants::FunctionVariants;
70 : #[doc(inline)]
71 : pub use functionstarts::FunctionStarts;
72 : #[doc(inline)]
73 : pub use linker_opt_hint::LinkerOptHint;
74 : #[doc(inline)]
75 : pub use main_cmd::Main;
76 : #[doc(inline)]
77 : pub use note::Note;
78 : #[doc(inline)]
79 : pub use routine::Routine;
80 : #[doc(inline)]
81 : pub use rpath::RPath;
82 : #[doc(inline)]
83 : pub use segment::Segment;
84 : #[doc(inline)]
85 : pub use segment_split_info::SegmentSplitInfo;
86 : #[doc(inline)]
87 : pub use source_version::SourceVersion;
88 : #[doc(inline)]
89 : pub use sub_client::SubClient;
90 : #[doc(inline)]
91 : pub use sub_framework::SubFramework;
92 : #[doc(inline)]
93 : pub use symbol_command::SymbolCommand;
94 : #[doc(inline)]
95 : pub use thread_command::ThreadCommand;
96 : #[doc(inline)]
97 : pub use two_level_hints::TwoLevelHints;
98 : #[doc(inline)]
99 : pub use unknown::Unknown;
100 : #[doc(inline)]
101 : pub use uuid::UUID;
102 : #[doc(inline)]
103 : pub use version_min::VersionMin;
104 :
105 : use crate::common::FromFFI;
106 : use crate::{declare_iterator, to_slice};
107 :
108 474279 : #[derive(Debug, Copy, Clone)]
109 : pub enum LoadCommandTypes {
110 : BuildVersion,
111 : CodeSignature,
112 : DataInCode,
113 : DyldChainedFixups,
114 : DyldEnvironment,
115 : DyldExportsTrie,
116 : DyldInfo,
117 : DyldInfoOnly,
118 : DylibCodeSignDrs,
119 : Dysymtab,
120 : EncryptionInfo,
121 : EncryptionInfo64,
122 : FilesetEntry,
123 : FunctionStarts,
124 : Fvmfile,
125 : Ident,
126 : Idfvmlib,
127 : IdDylib,
128 : IdDylinker,
129 : LazyLoadDylib,
130 : LinkerOptimizationHint,
131 : LinkerOption,
132 : LoadFvmLib,
133 : LoadDylib,
134 : LoadDylinker,
135 : LoadUpwardDylib,
136 : LoadWeakDylib,
137 : Main,
138 : Note,
139 : PrebindCksum,
140 : PreboundDylib,
141 : Prepage,
142 : ReExportDylib,
143 : Routines,
144 : Routines64,
145 : Rpath,
146 : Segment,
147 : Segment64,
148 : SegmentSplitInfo,
149 : SourceVersion,
150 : SubClient,
151 : SubFramework,
152 : SubLibrary,
153 : SubUmbrella,
154 : Symseg,
155 : Symtab,
156 : Thread,
157 : TwoLevelHints,
158 : Unixthread,
159 : Uuid,
160 : VersionMinIphoneOS,
161 : VersionMinMacOSX,
162 : VersionMinTvOS,
163 : VersionMinWatchOS,
164 : AtomInfo,
165 : FunctionVariants,
166 : FunctionVariantsFixups,
167 : TargetTriple,
168 :
169 : LiefUnknown,
170 : Unknown(u64),
171 : }
172 : impl LoadCommandTypes {
173 : const LC_BUILD_VERSION: u64 = 0x00000032;
174 : const LC_CODE_SIGNATURE: u64 = 0x0000001D;
175 : const LC_DATA_IN_CODE: u64 = 0x00000029;
176 : const LC_DYLD_CHAINED_FIXUPS: u64 = 0x80000034;
177 : const LC_DYLD_ENVIRONMENT: u64 = 0x00000027;
178 : const LC_DYLD_EXPORTS_TRIE: u64 = 0x80000033;
179 : const LC_DYLD_INFO: u64 = 0x00000022;
180 : const LC_DYLD_INFO_ONLY: u64 = 0x80000022;
181 : const LC_DYLIB_CODE_SIGN_DRS: u64 = 0x0000002B;
182 : const LC_DYSYMTAB: u64 = 0x0000000B;
183 : const LC_ENCRYPTION_INFO: u64 = 0x00000021;
184 : const LC_ENCRYPTION_INFO_64: u64 = 0x0000002C;
185 : const LC_FILESET_ENTRY: u64 = 0x80000035;
186 : const LC_FUNCTION_STARTS: u64 = 0x00000026;
187 : const LC_FVMFILE: u64 = 0x00000009;
188 : const LC_IDENT: u64 = 0x00000008;
189 : const LC_IDFVMLIB: u64 = 0x00000007;
190 : const LC_ID_DYLIB: u64 = 0x0000000D;
191 : const LC_ID_DYLINKER: u64 = 0x0000000F;
192 : const LC_LAZY_LOAD_DYLIB: u64 = 0x00000020;
193 : const LC_LINKER_OPTIMIZATION_HINT: u64 = 0x0000002E;
194 : const LC_LINKER_OPTION: u64 = 0x0000002D;
195 : const LC_LOADFVMLIB: u64 = 0x00000006;
196 : const LC_LOAD_DYLIB: u64 = 0x0000000C;
197 : const LC_LOAD_DYLINKER: u64 = 0x0000000E;
198 : const LC_LOAD_UPWARD_DYLIB: u64 = 0x80000023;
199 : const LC_LOAD_WEAK_DYLIB: u64 = 0x80000018;
200 : const LC_MAIN: u64 = 0x80000028;
201 : const LC_NOTE: u64 = 0x00000031;
202 : const LC_PREBIND_CKSUM: u64 = 0x00000017;
203 : const LC_PREBOUND_DYLIB: u64 = 0x00000010;
204 : const LC_PREPAGE: u64 = 0x0000000A;
205 : const LC_REEXPORT_DYLIB: u64 = 0x8000001F;
206 : const LC_ROUTINES: u64 = 0x00000011;
207 : const LC_ROUTINES_64: u64 = 0x0000001A;
208 : const LC_RPATH: u64 = 0x8000001C;
209 : const LC_SEGMENT: u64 = 0x00000001;
210 : const LC_SEGMENT_64: u64 = 0x00000019;
211 : const LC_SEGMENT_SPLIT_INFO: u64 = 0x0000001E;
212 : const LC_SOURCE_VERSION: u64 = 0x0000002A;
213 : const LC_SUB_CLIENT: u64 = 0x00000014;
214 : const LC_SUB_FRAMEWORK: u64 = 0x00000012;
215 : const LC_SUB_LIBRARY: u64 = 0x00000015;
216 : const LC_SUB_UMBRELLA: u64 = 0x00000013;
217 : const LC_SYMSEG: u64 = 0x00000003;
218 : const LC_SYMTAB: u64 = 0x00000002;
219 : const LC_THREAD: u64 = 0x00000004;
220 : const LC_TWOLEVEL_HINTS: u64 = 0x00000016;
221 : const LC_UNIXTHREAD: u64 = 0x00000005;
222 : const LC_UUID: u64 = 0x0000001B;
223 : const LC_VERSION_MIN_IPHONEOS: u64 = 0x00000025;
224 : const LC_VERSION_MIN_MACOSX: u64 = 0x00000024;
225 : const LC_VERSION_MIN_TVOS: u64 = 0x0000002F;
226 : const LC_VERSION_MIN_WATCHOS: u64 = 0x00000030;
227 : const LC_ATOM_INFO: u64 = 0x00000036;
228 : const LC_FUNCTION_VARIANTS: u64 = 0x00000037;
229 : const LC_FUNCTION_VARIANT_FIXUPS: u64 = 0x00000038;
230 : const LC_TARGET_TRIPLE: u64 = 0x00000039;
231 :
232 : const LIEF_UNKNOWN: u64 = 0xffee0001;
233 : }
234 :
235 : impl From<u64> for LoadCommandTypes {
236 474279 : fn from(value: u64) -> Self {
237 474279 : match value {
238 598 : LoadCommandTypes::LC_BUILD_VERSION => LoadCommandTypes::BuildVersion,
239 260 : LoadCommandTypes::LC_CODE_SIGNATURE => LoadCommandTypes::CodeSignature,
240 338 : LoadCommandTypes::LC_DATA_IN_CODE => LoadCommandTypes::DataInCode,
241 104 : LoadCommandTypes::LC_DYLD_CHAINED_FIXUPS => LoadCommandTypes::DyldChainedFixups,
242 26 : LoadCommandTypes::LC_DYLD_ENVIRONMENT => LoadCommandTypes::DyldEnvironment,
243 104 : LoadCommandTypes::LC_DYLD_EXPORTS_TRIE => LoadCommandTypes::DyldExportsTrie,
244 0 : LoadCommandTypes::LC_DYLD_INFO => LoadCommandTypes::DyldInfo,
245 260 : LoadCommandTypes::LC_DYLD_INFO_ONLY => LoadCommandTypes::DyldInfoOnly,
246 26 : LoadCommandTypes::LC_DYLIB_CODE_SIGN_DRS => LoadCommandTypes::DylibCodeSignDrs,
247 416 : LoadCommandTypes::LC_DYSYMTAB => LoadCommandTypes::Dysymtab,
248 26 : LoadCommandTypes::LC_ENCRYPTION_INFO => LoadCommandTypes::EncryptionInfo,
249 0 : LoadCommandTypes::LC_ENCRYPTION_INFO_64 => LoadCommandTypes::EncryptionInfo64,
250 7618 : LoadCommandTypes::LC_FILESET_ENTRY => LoadCommandTypes::FilesetEntry,
251 364 : LoadCommandTypes::LC_FUNCTION_STARTS => LoadCommandTypes::FunctionStarts,
252 0 : LoadCommandTypes::LC_FVMFILE => LoadCommandTypes::Fvmfile,
253 0 : LoadCommandTypes::LC_IDENT => LoadCommandTypes::Ident,
254 0 : LoadCommandTypes::LC_IDFVMLIB => LoadCommandTypes::Idfvmlib,
255 286 : LoadCommandTypes::LC_ID_DYLIB => LoadCommandTypes::IdDylib,
256 0 : LoadCommandTypes::LC_ID_DYLINKER => LoadCommandTypes::IdDylinker,
257 0 : LoadCommandTypes::LC_LAZY_LOAD_DYLIB => LoadCommandTypes::LazyLoadDylib,
258 : LoadCommandTypes::LC_LINKER_OPTIMIZATION_HINT => {
259 26 : LoadCommandTypes::LinkerOptimizationHint
260 : }
261 0 : LoadCommandTypes::LC_LINKER_OPTION => LoadCommandTypes::LinkerOption,
262 0 : LoadCommandTypes::LC_LOADFVMLIB => LoadCommandTypes::LoadFvmLib,
263 78598 : LoadCommandTypes::LC_LOAD_DYLIB => LoadCommandTypes::LoadDylib,
264 104 : LoadCommandTypes::LC_LOAD_DYLINKER => LoadCommandTypes::LoadDylinker,
265 2366 : LoadCommandTypes::LC_LOAD_UPWARD_DYLIB => LoadCommandTypes::LoadUpwardDylib,
266 780 : LoadCommandTypes::LC_LOAD_WEAK_DYLIB => LoadCommandTypes::LoadWeakDylib,
267 78 : LoadCommandTypes::LC_MAIN => LoadCommandTypes::Main,
268 4680 : LoadCommandTypes::LC_NOTE => LoadCommandTypes::Note,
269 0 : LoadCommandTypes::LC_PREBIND_CKSUM => LoadCommandTypes::PrebindCksum,
270 0 : LoadCommandTypes::LC_PREBOUND_DYLIB => LoadCommandTypes::PreboundDylib,
271 0 : LoadCommandTypes::LC_PREPAGE => LoadCommandTypes::Prepage,
272 9308 : LoadCommandTypes::LC_REEXPORT_DYLIB => LoadCommandTypes::ReExportDylib,
273 0 : LoadCommandTypes::LC_ROUTINES => LoadCommandTypes::Routines,
274 26 : LoadCommandTypes::LC_ROUTINES_64 => LoadCommandTypes::Routines64,
275 78 : LoadCommandTypes::LC_RPATH => LoadCommandTypes::Rpath,
276 201773 : LoadCommandTypes::LC_SEGMENT => LoadCommandTypes::Segment,
277 163462 : LoadCommandTypes::LC_SEGMENT_64 => LoadCommandTypes::Segment64,
278 104 : LoadCommandTypes::LC_SEGMENT_SPLIT_INFO => LoadCommandTypes::SegmentSplitInfo,
279 338 : LoadCommandTypes::LC_SOURCE_VERSION => LoadCommandTypes::SourceVersion,
280 494 : LoadCommandTypes::LC_SUB_CLIENT => LoadCommandTypes::SubClient,
281 52 : LoadCommandTypes::LC_SUB_FRAMEWORK => LoadCommandTypes::SubFramework,
282 0 : LoadCommandTypes::LC_SUB_LIBRARY => LoadCommandTypes::SubLibrary,
283 0 : LoadCommandTypes::LC_SUB_UMBRELLA => LoadCommandTypes::SubUmbrella,
284 0 : LoadCommandTypes::LC_SYMSEG => LoadCommandTypes::Symseg,
285 416 : LoadCommandTypes::LC_SYMTAB => LoadCommandTypes::Symtab,
286 0 : LoadCommandTypes::LC_THREAD => LoadCommandTypes::Thread,
287 26 : LoadCommandTypes::LC_TWOLEVEL_HINTS => LoadCommandTypes::TwoLevelHints,
288 52 : LoadCommandTypes::LC_UNIXTHREAD => LoadCommandTypes::Unixthread,
289 806 : LoadCommandTypes::LC_UUID => LoadCommandTypes::Uuid,
290 52 : LoadCommandTypes::LC_VERSION_MIN_IPHONEOS => LoadCommandTypes::VersionMinIphoneOS,
291 156 : LoadCommandTypes::LC_VERSION_MIN_MACOSX => LoadCommandTypes::VersionMinMacOSX,
292 0 : LoadCommandTypes::LC_VERSION_MIN_TVOS => LoadCommandTypes::VersionMinTvOS,
293 0 : LoadCommandTypes::LC_VERSION_MIN_WATCHOS => LoadCommandTypes::VersionMinWatchOS,
294 0 : LoadCommandTypes::LC_ATOM_INFO => LoadCommandTypes::AtomInfo,
295 26 : LoadCommandTypes::LC_FUNCTION_VARIANTS => LoadCommandTypes::FunctionVariants,
296 : LoadCommandTypes::LC_FUNCTION_VARIANT_FIXUPS => {
297 0 : LoadCommandTypes::FunctionVariantsFixups
298 : }
299 0 : LoadCommandTypes::LC_TARGET_TRIPLE => LoadCommandTypes::TargetTriple,
300 52 : LoadCommandTypes::LIEF_UNKNOWN => LoadCommandTypes::LiefUnknown,
301 0 : _ => LoadCommandTypes::Unknown(value),
302 : }
303 474279 : }
304 : }
305 :
306 : impl From<LoadCommandTypes> for u64 {
307 0 : fn from(value: LoadCommandTypes) -> Self {
308 0 : match value {
309 0 : LoadCommandTypes::BuildVersion => LoadCommandTypes::LC_BUILD_VERSION,
310 0 : LoadCommandTypes::CodeSignature => LoadCommandTypes::LC_CODE_SIGNATURE,
311 0 : LoadCommandTypes::DataInCode => LoadCommandTypes::LC_DATA_IN_CODE,
312 0 : LoadCommandTypes::DyldChainedFixups => LoadCommandTypes::LC_DYLD_CHAINED_FIXUPS,
313 0 : LoadCommandTypes::DyldEnvironment => LoadCommandTypes::LC_DYLD_ENVIRONMENT,
314 0 : LoadCommandTypes::DyldExportsTrie => LoadCommandTypes::LC_DYLD_EXPORTS_TRIE,
315 0 : LoadCommandTypes::DyldInfo => LoadCommandTypes::LC_DYLD_INFO,
316 0 : LoadCommandTypes::DyldInfoOnly => LoadCommandTypes::LC_DYLD_INFO_ONLY,
317 0 : LoadCommandTypes::DylibCodeSignDrs => LoadCommandTypes::LC_DYLIB_CODE_SIGN_DRS,
318 0 : LoadCommandTypes::Dysymtab => LoadCommandTypes::LC_DYSYMTAB,
319 0 : LoadCommandTypes::EncryptionInfo => LoadCommandTypes::LC_ENCRYPTION_INFO,
320 0 : LoadCommandTypes::EncryptionInfo64 => LoadCommandTypes::LC_ENCRYPTION_INFO_64,
321 0 : LoadCommandTypes::FilesetEntry => LoadCommandTypes::LC_FILESET_ENTRY,
322 0 : LoadCommandTypes::FunctionStarts => LoadCommandTypes::LC_FUNCTION_STARTS,
323 0 : LoadCommandTypes::Fvmfile => LoadCommandTypes::LC_FVMFILE,
324 0 : LoadCommandTypes::Ident => LoadCommandTypes::LC_IDENT,
325 0 : LoadCommandTypes::Idfvmlib => LoadCommandTypes::LC_IDFVMLIB,
326 0 : LoadCommandTypes::IdDylib => LoadCommandTypes::LC_ID_DYLIB,
327 0 : LoadCommandTypes::IdDylinker => LoadCommandTypes::LC_ID_DYLINKER,
328 0 : LoadCommandTypes::LazyLoadDylib => LoadCommandTypes::LC_LAZY_LOAD_DYLIB,
329 : LoadCommandTypes::LinkerOptimizationHint => {
330 0 : LoadCommandTypes::LC_LINKER_OPTIMIZATION_HINT
331 : }
332 0 : LoadCommandTypes::LinkerOption => LoadCommandTypes::LC_LINKER_OPTION,
333 0 : LoadCommandTypes::LoadFvmLib => LoadCommandTypes::LC_LOADFVMLIB,
334 0 : LoadCommandTypes::LoadDylib => LoadCommandTypes::LC_LOAD_DYLIB,
335 0 : LoadCommandTypes::LoadDylinker => LoadCommandTypes::LC_LOAD_DYLINKER,
336 0 : LoadCommandTypes::LoadUpwardDylib => LoadCommandTypes::LC_LOAD_UPWARD_DYLIB,
337 0 : LoadCommandTypes::LoadWeakDylib => LoadCommandTypes::LC_LOAD_WEAK_DYLIB,
338 0 : LoadCommandTypes::Main => LoadCommandTypes::LC_MAIN,
339 0 : LoadCommandTypes::Note => LoadCommandTypes::LC_NOTE,
340 0 : LoadCommandTypes::PrebindCksum => LoadCommandTypes::LC_PREBIND_CKSUM,
341 0 : LoadCommandTypes::PreboundDylib => LoadCommandTypes::LC_PREBOUND_DYLIB,
342 0 : LoadCommandTypes::Prepage => LoadCommandTypes::LC_PREPAGE,
343 0 : LoadCommandTypes::ReExportDylib => LoadCommandTypes::LC_REEXPORT_DYLIB,
344 0 : LoadCommandTypes::Routines => LoadCommandTypes::LC_ROUTINES,
345 0 : LoadCommandTypes::Routines64 => LoadCommandTypes::LC_ROUTINES_64,
346 0 : LoadCommandTypes::Rpath => LoadCommandTypes::LC_RPATH,
347 0 : LoadCommandTypes::Segment => LoadCommandTypes::LC_SEGMENT,
348 0 : LoadCommandTypes::Segment64 => LoadCommandTypes::LC_SEGMENT_64,
349 0 : LoadCommandTypes::SegmentSplitInfo => LoadCommandTypes::LC_SEGMENT_SPLIT_INFO,
350 0 : LoadCommandTypes::SourceVersion => LoadCommandTypes::LC_SOURCE_VERSION,
351 0 : LoadCommandTypes::SubClient => LoadCommandTypes::LC_SUB_CLIENT,
352 0 : LoadCommandTypes::SubFramework => LoadCommandTypes::LC_SUB_FRAMEWORK,
353 0 : LoadCommandTypes::SubLibrary => LoadCommandTypes::LC_SUB_LIBRARY,
354 0 : LoadCommandTypes::SubUmbrella => LoadCommandTypes::LC_SUB_UMBRELLA,
355 0 : LoadCommandTypes::Symseg => LoadCommandTypes::LC_SYMSEG,
356 0 : LoadCommandTypes::Symtab => LoadCommandTypes::LC_SYMTAB,
357 0 : LoadCommandTypes::Thread => LoadCommandTypes::LC_THREAD,
358 0 : LoadCommandTypes::TwoLevelHints => LoadCommandTypes::LC_TWOLEVEL_HINTS,
359 0 : LoadCommandTypes::Unixthread => LoadCommandTypes::LC_UNIXTHREAD,
360 0 : LoadCommandTypes::Uuid => LoadCommandTypes::LC_UUID,
361 0 : LoadCommandTypes::VersionMinIphoneOS => LoadCommandTypes::LC_VERSION_MIN_IPHONEOS,
362 0 : LoadCommandTypes::VersionMinMacOSX => LoadCommandTypes::LC_VERSION_MIN_MACOSX,
363 0 : LoadCommandTypes::VersionMinTvOS => LoadCommandTypes::LC_VERSION_MIN_TVOS,
364 0 : LoadCommandTypes::VersionMinWatchOS => LoadCommandTypes::LC_VERSION_MIN_WATCHOS,
365 0 : LoadCommandTypes::AtomInfo => LoadCommandTypes::LC_ATOM_INFO,
366 0 : LoadCommandTypes::FunctionVariants => LoadCommandTypes::LC_FUNCTION_VARIANTS,
367 : LoadCommandTypes::FunctionVariantsFixups => {
368 0 : LoadCommandTypes::LC_FUNCTION_VARIANT_FIXUPS
369 : }
370 0 : LoadCommandTypes::TargetTriple => LoadCommandTypes::LC_TARGET_TRIPLE,
371 0 : LoadCommandTypes::LiefUnknown => LoadCommandTypes::LIEF_UNKNOWN,
372 0 : LoadCommandTypes::Unknown(value) => value,
373 : }
374 0 : }
375 : }
376 :
377 10699 : #[derive(Debug)]
378 : /// Enum that wraps all the different Mach-O load commands (`LC_xxx`).
379 : /// Note that all these commands implements the trait: [`Command`]
380 : pub enum Commands<'a> {
381 : Generic(Generic<'a>),
382 : BuildVersion(BuildVersion<'a>),
383 : CodeSignature(CodeSignature<'a>),
384 : CodeSignatureDir(CodeSignatureDir<'a>),
385 : DataInCode(DataInCode<'a>),
386 : DyldChainedFixups(DyldChainedFixups<'a>),
387 : DyldEnvironment(DyldEnvironment<'a>),
388 : DyldExportsTrie(DyldExportsTrie<'a>),
389 : DyldInfo(DyldInfo<'a>),
390 : Dylib(Dylib<'a>),
391 : Dylinker(Dylinker<'a>),
392 : DynamicSymbolCommand(DynamicSymbolCommand<'a>),
393 : EncryptionInfo(EncryptionInfo<'a>),
394 : Fileset(Fileset<'a>),
395 : FunctionStarts(FunctionStarts<'a>),
396 : LinkerOptHint(LinkerOptHint<'a>),
397 : Main(Main<'a>),
398 : RPath(RPath<'a>),
399 : Routine(Routine<'a>),
400 : Segment(Segment<'a>),
401 : SegmentSplitInfo(SegmentSplitInfo<'a>),
402 : SourceVersion(SourceVersion<'a>),
403 : SubFramework(SubFramework<'a>),
404 : SubClient(SubClient<'a>),
405 : SymbolCommand(SymbolCommand<'a>),
406 : ThreadCommand(ThreadCommand<'a>),
407 : TwoLevelHints(TwoLevelHints<'a>),
408 : UUID(UUID<'a>),
409 : VersionMin(VersionMin<'a>),
410 : AtomInfo(AtomInfo<'a>),
411 : Note(Note<'a>),
412 : FunctionVariants(FunctionVariants<'a>),
413 : FunctionVariantFixups(FunctionVariantFixups<'a>),
414 : Unknown(Unknown<'a>),
415 : }
416 :
417 : impl FromFFI<ffi::MachO_Command> for Commands<'_> {
418 10699 : fn from_ffi(ffi_entry: cxx::UniquePtr<ffi::MachO_Command>) -> Self {
419 10699 : unsafe {
420 10699 : let cmd_ref = ffi_entry.as_ref().unwrap();
421 10699 :
422 10699 : if ffi::MachO_Dylib::classof(cmd_ref) {
423 1287 : let raw = {
424 1287 : type From = cxx::UniquePtr<ffi::MachO_Command>;
425 1287 : type To = cxx::UniquePtr<ffi::MachO_Dylib>;
426 1287 : std::mem::transmute::<From, To>(ffi_entry)
427 1287 : };
428 1287 : Commands::Dylib(Dylib::from_ffi(raw))
429 9412 : } else if ffi::MachO_Main::classof(cmd_ref) {
430 39 : let raw = {
431 39 : type From = cxx::UniquePtr<ffi::MachO_Command>;
432 39 : type To = cxx::UniquePtr<ffi::MachO_Main>;
433 39 : std::mem::transmute::<From, To>(ffi_entry)
434 39 : };
435 39 : Commands::Main(Main::from_ffi(raw))
436 9373 : } else if ffi::MachO_SegmentCommand::classof(cmd_ref) {
437 1300 : let raw = {
438 1300 : type From = cxx::UniquePtr<ffi::MachO_Command>;
439 1300 : type To = cxx::UniquePtr<ffi::MachO_SegmentCommand>;
440 1300 : std::mem::transmute::<From, To>(ffi_entry)
441 1300 : };
442 1300 : Commands::Segment(Segment::from_ffi(raw))
443 8073 : } else if ffi::MachO_DyldInfo::classof(cmd_ref) {
444 130 : let raw = {
445 130 : type From = cxx::UniquePtr<ffi::MachO_Command>;
446 130 : type To = cxx::UniquePtr<ffi::MachO_DyldInfo>;
447 130 : std::mem::transmute::<From, To>(ffi_entry)
448 130 : };
449 130 : Commands::DyldInfo(DyldInfo::from_ffi(raw))
450 7943 : } else if ffi::MachO_UUIDCommand::classof(cmd_ref) {
451 403 : let raw = {
452 403 : type From = cxx::UniquePtr<ffi::MachO_Command>;
453 403 : type To = cxx::UniquePtr<ffi::MachO_UUIDCommand>;
454 403 : std::mem::transmute::<From, To>(ffi_entry)
455 403 : };
456 403 : Commands::UUID(UUID::from_ffi(raw))
457 7540 : } else if ffi::MachO_Dylinker::classof(cmd_ref) {
458 52 : let raw = {
459 52 : type From = cxx::UniquePtr<ffi::MachO_Command>;
460 52 : type To = cxx::UniquePtr<ffi::MachO_Dylinker>;
461 52 : std::mem::transmute::<From, To>(ffi_entry)
462 52 : };
463 52 : Commands::Dylinker(Dylinker::from_ffi(raw))
464 7488 : } else if ffi::MachO_Fileset::classof(cmd_ref) {
465 3809 : let raw = {
466 3809 : type From = cxx::UniquePtr<ffi::MachO_Command>;
467 3809 : type To = cxx::UniquePtr<ffi::MachO_Fileset>;
468 3809 : std::mem::transmute::<From, To>(ffi_entry)
469 3809 : };
470 3809 : Commands::Fileset(Fileset::from_ffi(raw))
471 3679 : } else if ffi::MachO_FunctionStarts::classof(cmd_ref) {
472 182 : let raw = {
473 182 : type From = cxx::UniquePtr<ffi::MachO_Command>;
474 182 : type To = cxx::UniquePtr<ffi::MachO_FunctionStarts>;
475 182 : std::mem::transmute::<From, To>(ffi_entry)
476 182 : };
477 182 : Commands::FunctionStarts(FunctionStarts::from_ffi(raw))
478 3497 : } else if ffi::MachO_SourceVersion::classof(cmd_ref) {
479 169 : let raw = {
480 169 : type From = cxx::UniquePtr<ffi::MachO_Command>;
481 169 : type To = cxx::UniquePtr<ffi::MachO_SourceVersion>;
482 169 : std::mem::transmute::<From, To>(ffi_entry)
483 169 : };
484 169 : Commands::SourceVersion(SourceVersion::from_ffi(raw))
485 3328 : } else if ffi::MachO_ThreadCommand::classof(cmd_ref) {
486 26 : let raw = {
487 26 : type From = cxx::UniquePtr<ffi::MachO_Command>;
488 26 : type To = cxx::UniquePtr<ffi::MachO_ThreadCommand>;
489 26 : std::mem::transmute::<From, To>(ffi_entry)
490 26 : };
491 26 : Commands::ThreadCommand(ThreadCommand::from_ffi(raw))
492 3302 : } else if ffi::MachO_RPathCommand::classof(cmd_ref) {
493 52 : let raw = {
494 52 : type From = cxx::UniquePtr<ffi::MachO_Command>;
495 52 : type To = cxx::UniquePtr<ffi::MachO_RPathCommand>;
496 52 : std::mem::transmute::<From, To>(ffi_entry)
497 52 : };
498 52 : Commands::RPath(RPath::from_ffi(raw))
499 3250 : } else if ffi::MachO_Routine::classof(cmd_ref) {
500 13 : let raw = {
501 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
502 13 : type To = cxx::UniquePtr<ffi::MachO_Routine>;
503 13 : std::mem::transmute::<From, To>(ffi_entry)
504 13 : };
505 13 : Commands::Routine(Routine::from_ffi(raw))
506 3237 : } else if ffi::MachO_SymbolCommand::classof(cmd_ref) {
507 208 : let raw = {
508 208 : type From = cxx::UniquePtr<ffi::MachO_Command>;
509 208 : type To = cxx::UniquePtr<ffi::MachO_SymbolCommand>;
510 208 : std::mem::transmute::<From, To>(ffi_entry)
511 208 : };
512 208 : Commands::SymbolCommand(SymbolCommand::from_ffi(raw))
513 3029 : } else if ffi::MachO_DynamicSymbolCommand::classof(cmd_ref) {
514 208 : let raw = {
515 208 : type From = cxx::UniquePtr<ffi::MachO_Command>;
516 208 : type To = cxx::UniquePtr<ffi::MachO_DynamicSymbolCommand>;
517 208 : std::mem::transmute::<From, To>(ffi_entry)
518 208 : };
519 208 : Commands::DynamicSymbolCommand(DynamicSymbolCommand::from_ffi(raw))
520 2821 : } else if ffi::MachO_CodeSignature::classof(cmd_ref) {
521 130 : let raw = {
522 130 : type From = cxx::UniquePtr<ffi::MachO_Command>;
523 130 : type To = cxx::UniquePtr<ffi::MachO_CodeSignature>;
524 130 : std::mem::transmute::<From, To>(ffi_entry)
525 130 : };
526 130 : Commands::CodeSignature(CodeSignature::from_ffi(raw))
527 2691 : } else if ffi::MachO_CodeSignatureDir::classof(cmd_ref) {
528 13 : let raw = {
529 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
530 13 : type To = cxx::UniquePtr<ffi::MachO_CodeSignatureDir>;
531 13 : std::mem::transmute::<From, To>(ffi_entry)
532 13 : };
533 13 : Commands::CodeSignatureDir(CodeSignatureDir::from_ffi(raw))
534 2678 : } else if ffi::MachO_DataInCode::classof(cmd_ref) {
535 169 : let raw = {
536 169 : type From = cxx::UniquePtr<ffi::MachO_Command>;
537 169 : type To = cxx::UniquePtr<ffi::MachO_DataInCode>;
538 169 : std::mem::transmute::<From, To>(ffi_entry)
539 169 : };
540 169 : Commands::DataInCode(DataInCode::from_ffi(raw))
541 2509 : } else if ffi::MachO_SegmentSplitInfo::classof(cmd_ref) {
542 52 : let raw = {
543 52 : type From = cxx::UniquePtr<ffi::MachO_Command>;
544 52 : type To = cxx::UniquePtr<ffi::MachO_SegmentSplitInfo>;
545 52 : std::mem::transmute::<From, To>(ffi_entry)
546 52 : };
547 52 : Commands::SegmentSplitInfo(SegmentSplitInfo::from_ffi(raw))
548 2457 : } else if ffi::MachO_EncryptionInfo::classof(cmd_ref) {
549 13 : let raw = {
550 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
551 13 : type To = cxx::UniquePtr<ffi::MachO_EncryptionInfo>;
552 13 : std::mem::transmute::<From, To>(ffi_entry)
553 13 : };
554 13 : Commands::EncryptionInfo(EncryptionInfo::from_ffi(raw))
555 2444 : } else if ffi::MachO_SubFramework::classof(cmd_ref) {
556 26 : let raw = {
557 26 : type From = cxx::UniquePtr<ffi::MachO_Command>;
558 26 : type To = cxx::UniquePtr<ffi::MachO_SubFramework>;
559 26 : std::mem::transmute::<From, To>(ffi_entry)
560 26 : };
561 26 : Commands::SubFramework(SubFramework::from_ffi(raw))
562 2418 : } else if ffi::MachO_SubClient::classof(cmd_ref) {
563 247 : let raw = {
564 247 : type From = cxx::UniquePtr<ffi::MachO_Command>;
565 247 : type To = cxx::UniquePtr<ffi::MachO_SubClient>;
566 247 : std::mem::transmute::<From, To>(ffi_entry)
567 247 : };
568 247 : Commands::SubClient(SubClient::from_ffi(raw))
569 2171 : } else if ffi::MachO_DyldEnvironment::classof(cmd_ref) {
570 13 : let raw = {
571 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
572 13 : type To = cxx::UniquePtr<ffi::MachO_DyldEnvironment>;
573 13 : std::mem::transmute::<From, To>(ffi_entry)
574 13 : };
575 13 : Commands::DyldEnvironment(DyldEnvironment::from_ffi(raw))
576 2158 : } else if ffi::MachO_BuildVersion::classof(cmd_ref) {
577 299 : let raw = {
578 299 : type From = cxx::UniquePtr<ffi::MachO_Command>;
579 299 : type To = cxx::UniquePtr<ffi::MachO_BuildVersion>;
580 299 : std::mem::transmute::<From, To>(ffi_entry)
581 299 : };
582 299 : Commands::BuildVersion(BuildVersion::from_ffi(raw))
583 1859 : } else if ffi::MachO_DyldChainedFixups::classof(cmd_ref) {
584 52 : let raw = {
585 52 : type From = cxx::UniquePtr<ffi::MachO_Command>;
586 52 : type To = cxx::UniquePtr<ffi::MachO_DyldChainedFixups>;
587 52 : std::mem::transmute::<From, To>(ffi_entry)
588 52 : };
589 52 : Commands::DyldChainedFixups(DyldChainedFixups::from_ffi(raw))
590 1807 : } else if ffi::MachO_DyldExportsTrie::classof(cmd_ref) {
591 52 : let raw = {
592 52 : type From = cxx::UniquePtr<ffi::MachO_Command>;
593 52 : type To = cxx::UniquePtr<ffi::MachO_DyldExportsTrie>;
594 52 : std::mem::transmute::<From, To>(ffi_entry)
595 52 : };
596 52 : Commands::DyldExportsTrie(DyldExportsTrie::from_ffi(raw))
597 1755 : } else if ffi::MachO_TwoLevelHints::classof(cmd_ref) {
598 13 : let raw = {
599 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
600 13 : type To = cxx::UniquePtr<ffi::MachO_TwoLevelHints>;
601 13 : std::mem::transmute::<From, To>(ffi_entry)
602 13 : };
603 13 : Commands::TwoLevelHints(TwoLevelHints::from_ffi(raw))
604 1742 : } else if ffi::MachO_LinkerOptHint::classof(cmd_ref) {
605 13 : let raw = {
606 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
607 13 : type To = cxx::UniquePtr<ffi::MachO_LinkerOptHint>;
608 13 : std::mem::transmute::<From, To>(ffi_entry)
609 13 : };
610 13 : Commands::LinkerOptHint(LinkerOptHint::from_ffi(raw))
611 1729 : } else if ffi::MachO_VersionMin::classof(cmd_ref) {
612 104 : let raw = {
613 104 : type From = cxx::UniquePtr<ffi::MachO_Command>;
614 104 : type To = cxx::UniquePtr<ffi::MachO_VersionMin>;
615 104 : std::mem::transmute::<From, To>(ffi_entry)
616 104 : };
617 104 : Commands::VersionMin(VersionMin::from_ffi(raw))
618 1625 : } else if ffi::MachO_UnknownCommand::classof(cmd_ref) {
619 52 : let raw = {
620 52 : type From = cxx::UniquePtr<ffi::MachO_Command>;
621 52 : type To = cxx::UniquePtr<ffi::MachO_UnknownCommand>;
622 52 : std::mem::transmute::<From, To>(ffi_entry)
623 52 : };
624 52 : Commands::Unknown(Unknown::from_ffi(raw))
625 1573 : } else if ffi::MachO_AtomInfo::classof(cmd_ref) {
626 0 : let raw = {
627 0 : type From = cxx::UniquePtr<ffi::MachO_Command>;
628 0 : type To = cxx::UniquePtr<ffi::MachO_AtomInfo>;
629 0 : std::mem::transmute::<From, To>(ffi_entry)
630 0 : };
631 0 : Commands::AtomInfo(AtomInfo::from_ffi(raw))
632 1573 : } else if ffi::MachO_NoteCommand::classof(cmd_ref) {
633 1560 : let raw = {
634 1560 : type From = cxx::UniquePtr<ffi::MachO_Command>;
635 1560 : type To = cxx::UniquePtr<ffi::MachO_NoteCommand>;
636 1560 : std::mem::transmute::<From, To>(ffi_entry)
637 1560 : };
638 1560 : Commands::Note(Note::from_ffi(raw))
639 13 : } else if ffi::MachO_FunctionVariants::classof(cmd_ref) {
640 13 : let raw = {
641 13 : type From = cxx::UniquePtr<ffi::MachO_Command>;
642 13 : type To = cxx::UniquePtr<ffi::MachO_FunctionVariants>;
643 13 : std::mem::transmute::<From, To>(ffi_entry)
644 13 : };
645 13 : Commands::FunctionVariants(FunctionVariants::from_ffi(raw))
646 0 : } else if ffi::MachO_FunctionVariantFixups::classof(cmd_ref) {
647 0 : let raw = {
648 0 : type From = cxx::UniquePtr<ffi::MachO_Command>;
649 0 : type To = cxx::UniquePtr<ffi::MachO_FunctionVariantFixups>;
650 0 : std::mem::transmute::<From, To>(ffi_entry)
651 0 : };
652 0 : Commands::FunctionVariantFixups(FunctionVariantFixups::from_ffi(raw))
653 : } else {
654 0 : Commands::Generic(Generic::from_ffi(ffi_entry))
655 : }
656 : }
657 10699 : }
658 : }
659 :
660 : pub struct Generic<'a> {
661 : ptr: cxx::UniquePtr<ffi::MachO_Command>,
662 : _owner: PhantomData<&'a ffi::MachO_Binary>,
663 : }
664 :
665 : impl std::fmt::Debug for Generic<'_> {
666 0 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
667 0 : f.debug_struct("Generic").finish()
668 0 : }
669 : }
670 :
671 : impl FromFFI<ffi::MachO_Command> for Generic<'_> {
672 0 : fn from_ffi(cmd: cxx::UniquePtr<ffi::MachO_Command>) -> Self {
673 0 : Self {
674 0 : ptr: cmd,
675 0 : _owner: PhantomData,
676 0 : }
677 0 : }
678 : }
679 :
680 : /// Trait shared by **all** the load command: [`Commands`]
681 : pub trait Command {
682 : #[doc(hidden)]
683 : fn get_base(&self) -> &ffi::MachO_Command;
684 :
685 : /// Size of the command (should be greater than ``sizeof(load_command)``)
686 474279 : fn size(&self) -> u32 {
687 474279 : self.get_base().size()
688 474279 : }
689 :
690 : /// Offset of the command within the *Load Command Table*
691 474279 : fn offset(&self) -> u64 {
692 474279 : self.get_base().command_offset()
693 474279 : }
694 :
695 : /// The command's type
696 474279 : fn command_type(&self) -> LoadCommandTypes {
697 474279 : LoadCommandTypes::from(self.get_base().cmd_type())
698 474279 : }
699 :
700 : /// The raw command as a slice of bytes
701 474279 : fn data(&self) -> &[u8] {
702 474279 : to_slice!(self.get_base().data());
703 474279 : }
704 : }
705 :
706 : impl Command for Commands<'_> {
707 0 : fn get_base(&self) -> &ffi::MachO_Command {
708 0 : match &self {
709 0 : Commands::Generic(cmd) => cmd.get_base(),
710 0 : Commands::BuildVersion(cmd) => cmd.get_base(),
711 0 : Commands::CodeSignature(cmd) => cmd.get_base(),
712 0 : Commands::CodeSignatureDir(cmd) => cmd.get_base(),
713 0 : Commands::DataInCode(cmd) => cmd.get_base(),
714 0 : Commands::DyldChainedFixups(cmd) => cmd.get_base(),
715 0 : Commands::DyldEnvironment(cmd) => cmd.get_base(),
716 0 : Commands::DyldExportsTrie(cmd) => cmd.get_base(),
717 0 : Commands::DyldInfo(cmd) => cmd.get_base(),
718 0 : Commands::Dylib(cmd) => cmd.get_base(),
719 0 : Commands::Dylinker(cmd) => cmd.get_base(),
720 0 : Commands::DynamicSymbolCommand(cmd) => cmd.get_base(),
721 0 : Commands::EncryptionInfo(cmd) => cmd.get_base(),
722 0 : Commands::FunctionStarts(cmd) => cmd.get_base(),
723 0 : Commands::LinkerOptHint(cmd) => cmd.get_base(),
724 0 : Commands::Main(cmd) => cmd.get_base(),
725 0 : Commands::Routine(cmd) => cmd.get_base(),
726 0 : Commands::RPath(cmd) => cmd.get_base(),
727 0 : Commands::Segment(cmd) => cmd.get_base(),
728 0 : Commands::SegmentSplitInfo(cmd) => cmd.get_base(),
729 0 : Commands::SourceVersion(cmd) => cmd.get_base(),
730 0 : Commands::SubFramework(cmd) => cmd.get_base(),
731 0 : Commands::SubClient(cmd) => cmd.get_base(),
732 0 : Commands::SymbolCommand(cmd) => cmd.get_base(),
733 0 : Commands::ThreadCommand(cmd) => cmd.get_base(),
734 0 : Commands::TwoLevelHints(cmd) => cmd.get_base(),
735 0 : Commands::UUID(cmd) => cmd.get_base(),
736 0 : Commands::VersionMin(cmd) => cmd.get_base(),
737 0 : Commands::AtomInfo(cmd) => cmd.get_base(),
738 0 : Commands::Note(cmd) => cmd.get_base(),
739 0 : Commands::FunctionVariants(cmd) => cmd.get_base(),
740 0 : Commands::FunctionVariantFixups(cmd) => cmd.get_base(),
741 0 : Commands::Fileset(cmd) => cmd.get_base(),
742 0 : Commands::Unknown(cmd) => cmd.get_base(),
743 : }
744 0 : }
745 : }
746 :
747 : impl Command for Generic<'_> {
748 0 : fn get_base(&self) -> &ffi::MachO_Command {
749 0 : self.ptr.as_ref().unwrap()
750 0 : }
751 : }
752 :
753 : impl std::fmt::Debug for &dyn Command {
754 474279 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
755 474279 : f.debug_struct("Command")
756 474279 : .field("offset", &self.offset())
757 474279 : .field("size", &self.size())
758 474279 : .field("type", &self.command_type())
759 474279 : .field("data_len", &self.data().len())
760 474279 : .finish()
761 474279 : }
762 : }
763 :
764 10699 : declare_iterator!(
765 10699 : CommandsIter,
766 10699 : Commands<'a>,
767 10699 : ffi::MachO_Command,
768 10699 : ffi::MachO_Binary,
769 10699 : ffi::MachO_Binary_it_commands
770 10699 : );
|