Added the ability to get an abstract file type (executable, object file,
shared library, etc) and strata (user/kernel) from an object file. This will
help with plug-in and platform selection when given a new binary with the
"target create <file>" command.
llvm-svn: 134779
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 2e300a1..6c55360 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -1421,3 +1421,74 @@
return true;
}
+ObjectFile::Type
+ObjectFileELF::CalculateType()
+{
+ switch (m_header.e_type)
+ {
+ case llvm::ELF::ET_NONE:
+ // 0 - No file type
+ return eTypeUnknown;
+
+ case llvm::ELF::ET_REL:
+ // 1 - Relocatable file
+ return eTypeObjectFile;
+
+ case llvm::ELF::ET_EXEC:
+ // 2 - Executable file
+ return eTypeExecutable;
+
+ case llvm::ELF::ET_DYN:
+ // 3 - Shared object file
+ return eTypeSharedLibrary;
+
+ case ET_CORE:
+ // 4 - Core file
+ return eTypeCoreFile;
+
+ default:
+ break;
+ }
+ return eTypeUnknown;
+}
+
+ObjectFile::Strata
+ObjectFileELF::CalculateStrata()
+{
+ switch (m_header.e_type)
+ {
+ case llvm::ELF::ET_NONE:
+ // 0 - No file type
+ return eStrataUnknown;
+
+ case llvm::ELF::ET_REL:
+ // 1 - Relocatable file
+ return eStrataUnknown;
+
+ case llvm::ELF::ET_EXEC:
+ // 2 - Executable file
+ // TODO: is there any way to detect that an executable is a kernel
+ // related executable by inspecting the program headers, section
+ // headers, symbols, or any other flag bits???
+ return eStrataUser;
+
+ case llvm::ELF::ET_DYN:
+ // 3 - Shared object file
+ // TODO: is there any way to detect that an shared library is a kernel
+ // related executable by inspecting the program headers, section
+ // headers, symbols, or any other flag bits???
+ return eStrataUnknown;
+
+ case ET_CORE:
+ // 4 - Core file
+ // TODO: is there any way to detect that an core file is a kernel
+ // related executable by inspecting the program headers, section
+ // headers, symbols, or any other flag bits???
+ return eStrataUnknown;
+
+ default:
+ break;
+ }
+ return eStrataUnknown;
+}
+
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
index f442ea2..78d2b5d 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
@@ -104,6 +104,12 @@
virtual lldb_private::Address
GetEntryPointAddress ();
+
+ virtual ObjectFile::Type
+ CalculateType();
+
+ virtual ObjectFile::Strata
+ CalculateStrata();
private:
ObjectFileELF(lldb_private::Module* module,
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 2169dbc..0b75a7a 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -1672,6 +1672,90 @@
}
+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)
{
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index 0cd96ba..b1077fc 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -110,6 +110,12 @@
virtual lldb_private::Address
GetEntryPointAddress ();
+ virtual ObjectFile::Type
+ CalculateType();
+
+ virtual ObjectFile::Strata
+ CalculateStrata();
+
protected:
mutable lldb_private::Mutex m_mutex;
llvm::MachO::mach_header m_header;