summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp84
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)
{
OpenPOWER on IntegriCloud