diff options
Diffstat (limited to 'include/llvm/Object/COFF.h')
| -rw-r--r-- | include/llvm/Object/COFF.h | 100 | 
1 files changed, 89 insertions, 11 deletions
diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index ae695a529597..bf0172822d3f 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -562,8 +562,26 @@ struct coff_tls_directory {  using coff_tls_directory32 = coff_tls_directory<support::little32_t>;  using coff_tls_directory64 = coff_tls_directory<support::little64_t>; +/// Bits in control flow guard flags as we understand them. +enum class coff_guard_flags : uint32_t { +  CFInstrumented = 0x00000100, +  HasFidTable = 0x00000400, +  ProtectDelayLoadIAT = 0x00001000, +  DelayLoadIATSection = 0x00002000, // Delay load in separate section +  HasLongJmpTable = 0x00010000, +  FidTableHasFlags = 0x10000000, // Indicates that fid tables are 5 bytes +}; + +struct coff_load_config_code_integrity { +  support::ulittle16_t Flags; +  support::ulittle16_t Catalog; +  support::ulittle32_t CatalogOffset; +  support::ulittle32_t Reserved; +}; + +/// 32-bit load config (IMAGE_LOAD_CONFIG_DIRECTORY32)  struct coff_load_configuration32 { -  support::ulittle32_t Characteristics; +  support::ulittle32_t Size;    support::ulittle32_t TimeDateStamp;    support::ulittle16_t MajorVersion;    support::ulittle16_t MinorVersion; @@ -578,34 +596,81 @@ struct coff_load_configuration32 {    support::ulittle32_t ProcessAffinityMask;    support::ulittle32_t ProcessHeapFlags;    support::ulittle16_t CSDVersion; -  support::ulittle16_t Reserved; +  support::ulittle16_t DependentLoadFlags;    support::ulittle32_t EditList;    support::ulittle32_t SecurityCookie;    support::ulittle32_t SEHandlerTable;    support::ulittle32_t SEHandlerCount; + +  // Added in MSVC 2015 for /guard:cf. +  support::ulittle32_t GuardCFCheckFunction; +  support::ulittle32_t GuardCFCheckDispatch; +  support::ulittle32_t GuardCFFunctionTable; +  support::ulittle32_t GuardCFFunctionCount; +  support::ulittle32_t GuardFlags; // coff_guard_flags + +  // Added in MSVC 2017 +  coff_load_config_code_integrity CodeIntegrity; +  support::ulittle32_t GuardAddressTakenIatEntryTable; +  support::ulittle32_t GuardAddressTakenIatEntryCount; +  support::ulittle32_t GuardLongJumpTargetTable; +  support::ulittle32_t GuardLongJumpTargetCount; +  support::ulittle32_t DynamicValueRelocTable; +  support::ulittle32_t CHPEMetadataPointer; +  support::ulittle32_t GuardRFFailureRoutine; +  support::ulittle32_t GuardRFFailureRoutineFunctionPointer; +  support::ulittle32_t DynamicValueRelocTableOffset; +  support::ulittle16_t DynamicValueRelocTableSection; +  support::ulittle16_t Reserved2; +  support::ulittle32_t GuardRFVerifyStackPointerFunctionPointer; +  support::ulittle32_t HotPatchTableOffset;  }; +/// 64-bit load config (IMAGE_LOAD_CONFIG_DIRECTORY64)  struct coff_load_configuration64 { -  support::ulittle32_t Characteristics; +  support::ulittle32_t Size;    support::ulittle32_t TimeDateStamp;    support::ulittle16_t MajorVersion;    support::ulittle16_t MinorVersion;    support::ulittle32_t GlobalFlagsClear;    support::ulittle32_t GlobalFlagsSet;    support::ulittle32_t CriticalSectionDefaultTimeout; -  support::ulittle32_t DeCommitFreeBlockThreshold; -  support::ulittle32_t DeCommitTotalFreeThreshold; -  support::ulittle32_t LockPrefixTable; -  support::ulittle32_t MaximumAllocationSize; -  support::ulittle32_t VirtualMemoryThreshold; -  support::ulittle32_t ProcessAffinityMask; +  support::ulittle64_t DeCommitFreeBlockThreshold; +  support::ulittle64_t DeCommitTotalFreeThreshold; +  support::ulittle64_t LockPrefixTable; +  support::ulittle64_t MaximumAllocationSize; +  support::ulittle64_t VirtualMemoryThreshold; +  support::ulittle64_t ProcessAffinityMask;    support::ulittle32_t ProcessHeapFlags;    support::ulittle16_t CSDVersion; -  support::ulittle16_t Reserved; -  support::ulittle32_t EditList; +  support::ulittle16_t DependentLoadFlags; +  support::ulittle64_t EditList;    support::ulittle64_t SecurityCookie;    support::ulittle64_t SEHandlerTable;    support::ulittle64_t SEHandlerCount; + +  // Added in MSVC 2015 for /guard:cf. +  support::ulittle64_t GuardCFCheckFunction; +  support::ulittle64_t GuardCFCheckDispatch; +  support::ulittle64_t GuardCFFunctionTable; +  support::ulittle64_t GuardCFFunctionCount; +  support::ulittle32_t GuardFlags; + +  // Added in MSVC 2017 +  coff_load_config_code_integrity CodeIntegrity; +  support::ulittle64_t GuardAddressTakenIatEntryTable; +  support::ulittle64_t GuardAddressTakenIatEntryCount; +  support::ulittle64_t GuardLongJumpTargetTable; +  support::ulittle64_t GuardLongJumpTargetCount; +  support::ulittle64_t DynamicValueRelocTable; +  support::ulittle64_t CHPEMetadataPointer; +  support::ulittle64_t GuardRFFailureRoutine; +  support::ulittle64_t GuardRFFailureRoutineFunctionPointer; +  support::ulittle32_t DynamicValueRelocTableOffset; +  support::ulittle16_t DynamicValueRelocTableSection; +  support::ulittle16_t Reserved2; +  support::ulittle64_t GuardRFVerifyStackPointerFunctionPointer; +  support::ulittle32_t HotPatchTableOffset;  };  struct coff_runtime_function_x64 { @@ -684,6 +749,8 @@ private:    const coff_base_reloc_block_header *BaseRelocEnd;    const debug_directory *DebugDirectoryBegin;    const debug_directory *DebugDirectoryEnd; +  // Either coff_load_configuration32 or coff_load_configuration64. +  const void *LoadConfig;    std::error_code getString(uint32_t offset, StringRef &Res) const; @@ -698,6 +765,7 @@ private:    std::error_code initExportTablePtr();    std::error_code initBaseRelocPtr();    std::error_code initDebugDirectoryPtr(); +  std::error_code initLoadConfigPtr();  public:    uintptr_t getSymbolTable() const { @@ -775,6 +843,16 @@ public:      return getRawNumberOfSymbols();    } +  const coff_load_configuration32 *getLoadConfig32() const { +    assert(!is64()); +    return reinterpret_cast<const coff_load_configuration32 *>(LoadConfig); +  } + +  const coff_load_configuration64 *getLoadConfig64() const { +    assert(is64()); +    return reinterpret_cast<const coff_load_configuration64 *>(LoadConfig); +  } +  protected:    void moveSymbolNext(DataRefImpl &Symb) const override;    Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;  | 
