diff options
author | Greg Clayton <gclayton@apple.com> | 2011-07-09 00:41:34 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2011-07-09 00:41:34 +0000 |
commit | 9e00b6a6545e4d459cff2663ec679af1e147de68 (patch) | |
tree | a4cab09f307928503fabd2480122d94e5be8c973 /lldb/source | |
parent | c5c191b0a4dfc4dae622c2c2b0789652267050f5 (diff) | |
download | bcm5719-llvm-9e00b6a6545e4d459cff2663ec679af1e147de68.tar.gz bcm5719-llvm-9e00b6a6545e4d459cff2663ec679af1e147de68.zip |
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
Diffstat (limited to 'lldb/source')
4 files changed, 167 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 2e300a10d89..6c55360731c 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -1421,3 +1421,74 @@ ObjectFileELF::GetArchitecture (ArchSpec &arch) 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 f442ea218ab..78d2b5d6be1 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h @@ -104,6 +104,12 @@ public: 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 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) { diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h index 0cd96ba4344..b1077fcc272 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h @@ -110,6 +110,12 @@ public: 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; |