LCOV - code coverage report
Current view: top level - src/macho - commands.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 66.2 % 441 292
Test Date: 2026-04-12:00:00:00 Functions: 87.2 % 149 130

            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 : );
        

Generated by: LCOV version 2.1-1