diff options
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 2169dbc9aeb..0b75a7aef9c 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -1672,6 +1672,90 @@ ObjectFileMachO::GetEntryPointAddress () } +ObjectFile::Type +ObjectFileMachO::CalculateType() +{ + switch (m_header.filetype) + { + case HeaderFileTypeObject: // 0x1u MH_OBJECT + if (GetAddressByteSize () == 4) + { + // 32 bit kexts are just object files, but they do have a valid + // UUID load command. + UUID uuid; + if (GetUUID(&uuid)) + { + // this checking for the UUID load command is not enough + // we could eventually look for the symbol named + // "OSKextGetCurrentIdentifier" as this is required of kexts + if (m_strata == eStrataInvalid) + m_strata = eStrataKernel; + return eTypeSharedLibrary; + } + } + return eTypeObjectFile; + + case HeaderFileTypeExecutable: return eTypeExecutable; // 0x2u MH_EXECUTE + case HeaderFileTypeFixedVMShlib: return eTypeSharedLibrary; // 0x3u MH_FVMLIB + case HeaderFileTypeCore: return eTypeCoreFile; // 0x4u MH_CORE + case HeaderFileTypePreloadedExecutable: return eTypeSharedLibrary; // 0x5u MH_PRELOAD + case HeaderFileTypeDynamicShlib: return eTypeSharedLibrary; // 0x6u MH_DYLIB + case HeaderFileTypeDynamicLinkEditor: return eTypeDynamicLinker; // 0x7u MH_DYLINKER + case HeaderFileTypeBundle: return eTypeSharedLibrary; // 0x8u MH_BUNDLE + case HeaderFileTypeDynamicShlibStub: return eTypeStubLibrary; // 0x9u MH_DYLIB_STUB + case HeaderFileTypeDSYM: return eTypeDebugInfo; // 0xAu MH_DSYM + case HeaderFileTypeKextBundle: return eTypeSharedLibrary; // 0xBu MH_KEXT_BUNDLE + default: + break; + } + return eTypeUnknown; +} + +ObjectFile::Strata +ObjectFileMachO::CalculateStrata() +{ + switch (m_header.filetype) + { + case HeaderFileTypeObject: // 0x1u MH_OBJECT + { + // 32 bit kexts are just object files, but they do have a valid + // UUID load command. + UUID uuid; + if (GetUUID(&uuid)) + { + // this checking for the UUID load command is not enough + // we could eventually look for the symbol named + // "OSKextGetCurrentIdentifier" as this is required of kexts + if (m_type == eTypeInvalid) + m_type = eTypeSharedLibrary; + + return eStrataKernel; + } + } + return eStrataUnknown; + + case HeaderFileTypeExecutable: // 0x2u MH_EXECUTE + // Check for the MH_DYLDLINK bit in the flags + if (m_header.flags & HeaderFlagBitIsDynamicLinkObject) + return eStrataUser; + return eStrataKernel; + + case HeaderFileTypeFixedVMShlib: return eStrataUser; // 0x3u MH_FVMLIB + case HeaderFileTypeCore: return eStrataUnknown; // 0x4u MH_CORE + case HeaderFileTypePreloadedExecutable: return eStrataUser; // 0x5u MH_PRELOAD + case HeaderFileTypeDynamicShlib: return eStrataUser; // 0x6u MH_DYLIB + case HeaderFileTypeDynamicLinkEditor: return eStrataUser; // 0x7u MH_DYLINKER + case HeaderFileTypeBundle: return eStrataUser; // 0x8u MH_BUNDLE + case HeaderFileTypeDynamicShlibStub: return eStrataUser; // 0x9u MH_DYLIB_STUB + case HeaderFileTypeDSYM: return eStrataUnknown; // 0xAu MH_DSYM + case HeaderFileTypeKextBundle: return eStrataKernel; // 0xBu MH_KEXT_BUNDLE + default: + break; + } + return eStrataUnknown; +} + + bool ObjectFileMachO::GetArchitecture (ArchSpec &arch) { |