[llvm] 7450e0c - [yaml2obj] Add support for load config section data.

Jacek Caban via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 24 11:42:10 PDT 2023


Author: Jacek Caban
Date: 2023-07-24T20:41:20+02:00
New Revision: 7450e0c1d3f066c4ed0daadc7e28d97217a993ba

URL: https://github.com/llvm/llvm-project/commit/7450e0c1d3f066c4ed0daadc7e28d97217a993ba
DIFF: https://github.com/llvm/llvm-project/commit/7450e0c1d3f066c4ed0daadc7e28d97217a993ba.diff

LOG: [yaml2obj] Add support for load config section data.

Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D149440

Added: 
    llvm/test/tools/yaml2obj/COFF/load-config.yaml

Modified: 
    llvm/docs/yaml2obj.rst
    llvm/include/llvm/BinaryFormat/COFF.h
    llvm/include/llvm/ObjectYAML/COFFYAML.h
    llvm/lib/ObjectYAML/COFFEmitter.cpp
    llvm/lib/ObjectYAML/COFFYAML.cpp
    llvm/test/tools/llvm-readobj/arm64ec-chpe.yaml

Removed: 
    


################################################################################
diff  --git a/llvm/docs/yaml2obj.rst b/llvm/docs/yaml2obj.rst
index a0bca068d36420..f58fdd4f398eaf 100644
--- a/llvm/docs/yaml2obj.rst
+++ b/llvm/docs/yaml2obj.rst
@@ -34,6 +34,56 @@ Here's a sample COFF file.
       StructuredData:
         - Binary: {type: str}
         - UInt32: {type: int}
+        - LoadConfig:
+          Size: {type: int}
+          TimeDateStamp: {type: int}
+          MajorVersion: {type: int}
+          MinorVersion: {type: int}
+          GlobalFlagsClear: {type: int}
+          GlobalFlagsSet: {type: int}
+          CriticalSectionDefaultTimeout: {type: int}
+          DeCommitFreeBlockThreshold: {type: int}
+          DeCommitTotalFreeThreshold: {type: int}
+          LockPrefixTable: {type: int}
+          MaximumAllocationSize: {type: int}
+          VirtualMemoryThreshold: {type: int}
+          ProcessAffinityMask: {type: int}
+          ProcessHeapFlags: {type: int}
+          CSDVersion: {type: int}
+          DependentLoadFlags: {type: int}
+          EditList: {type: int}
+          SecurityCookie: {type: int}
+          SEHandlerTable: {type: int}
+          SEHandlerCount: {type: int}
+          GuardCFCheckFunction: {type: int}
+          GuardCFCheckDispatch: {type: int}
+          GuardCFFunctionTable: {type: int}
+          GuardCFFunctionCount: {type: int}
+          GuardFlags: {type: int}
+          CodeIntegrity:
+            Flags: {type: int}
+            Catalog: {type: int}
+            CatalogOffset: {type: int}
+          GuardAddressTakenIatEntryTable: {type: int}
+          GuardAddressTakenIatEntryCount: {type: int}
+          GuardLongJumpTargetTable: {type: int}
+          GuardLongJumpTargetCount: {type: int}
+          DynamicValueRelocTable: {type: int}
+          CHPEMetadataPointer: {type: int}
+          GuardRFFailureRoutine: {type: int}
+          GuardRFFailureRoutineFunctionPointer: {type: int}
+          DynamicValueRelocTableOffset: {type: int}
+          DynamicValueRelocTableSection: {type: int}
+          GuardRFVerifyStackPointerFunctionPointer: {type: int}
+          HotPatchTableOffset: {type: int}
+          EnclaveConfigurationPointer: {type: int}
+          VolatileMetadataPointer: {type: int}
+          GuardEHContinuationTable: {type: int}
+          GuardEHContinuationCount: {type: int}
+          GuardXFGCheckFunctionPointer: {type: int}
+          GuardXFGDispatchFunctionPointer: {type: int}
+          GuardXFGTableDispatchFunctionPointer: {type: int}
+          CastGuardOsDeterminedFailureMode: {type: int}
 
   symbols:
     - Name: .text

diff  --git a/llvm/include/llvm/BinaryFormat/COFF.h b/llvm/include/llvm/BinaryFormat/COFF.h
index d2ec2a2f67e54c..522ee37da6e830 100644
--- a/llvm/include/llvm/BinaryFormat/COFF.h
+++ b/llvm/include/llvm/BinaryFormat/COFF.h
@@ -130,6 +130,10 @@ template <typename T> bool isAnyArm64(T Machine) {
   return Machine == IMAGE_FILE_MACHINE_ARM64 || isArm64EC(Machine);
 }
 
+template <typename T> bool is64Bit(T Machine) {
+  return Machine == IMAGE_FILE_MACHINE_AMD64 || isAnyArm64(Machine);
+}
+
 enum Characteristics : unsigned {
   C_Invalid = 0,
 

diff  --git a/llvm/include/llvm/ObjectYAML/COFFYAML.h b/llvm/include/llvm/ObjectYAML/COFFYAML.h
index 1d941ae7b1a3e3..2f9a1aae0eb05a 100644
--- a/llvm/include/llvm/ObjectYAML/COFFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/COFFYAML.h
@@ -15,6 +15,7 @@
 
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/COFF.h"
+#include "llvm/Object/COFF.h"
 #include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
 #include "llvm/ObjectYAML/CodeViewYAMLTypeHashing.h"
 #include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
@@ -69,6 +70,8 @@ struct Relocation {
 struct SectionDataEntry {
   std::optional<uint32_t> UInt32;
   yaml::BinaryRef Binary;
+  std::optional<object::coff_load_configuration32> LoadConfig32;
+  std::optional<object::coff_load_configuration64> LoadConfig64;
 
   size_t size() const;
   void writeAsBinary(raw_ostream &OS) const;
@@ -246,6 +249,18 @@ template <> struct MappingTraits<COFF::AuxiliaryCLRToken> {
   static void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT);
 };
 
+template <> struct MappingTraits<object::coff_load_configuration32> {
+  static void mapping(IO &IO, object::coff_load_configuration32 &ACT);
+};
+
+template <> struct MappingTraits<object::coff_load_configuration64> {
+  static void mapping(IO &IO, object::coff_load_configuration64 &ACT);
+};
+
+template <> struct MappingTraits<object::coff_load_config_code_integrity> {
+  static void mapping(IO &IO, object::coff_load_config_code_integrity &ACT);
+};
+
 template <>
 struct MappingTraits<COFFYAML::Symbol> {
   static void mapping(IO &IO, COFFYAML::Symbol &S);

diff  --git a/llvm/lib/ObjectYAML/COFFEmitter.cpp b/llvm/lib/ObjectYAML/COFFEmitter.cpp
index b4ce90ddc87b85..2e72e4fa7f4916 100644
--- a/llvm/lib/ObjectYAML/COFFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/COFFEmitter.cpp
@@ -16,7 +16,6 @@
 #include "llvm/ADT/StringMap.h"
 #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
 #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
-#include "llvm/Object/COFF.h"
 #include "llvm/ObjectYAML/ObjectYAML.h"
 #include "llvm/ObjectYAML/yaml2obj.h"
 #include "llvm/Support/BinaryStreamWriter.h"
@@ -48,10 +47,7 @@ struct COFFParser {
   }
 
   bool isPE() const { return Obj.OptionalHeader.has_value(); }
-  bool is64Bit() const {
-    return Obj.Header.Machine == COFF::IMAGE_FILE_MACHINE_AMD64 ||
-           COFF::isAnyArm64(Obj.Header.Machine);
-  }
+  bool is64Bit() const { return COFF::is64Bit(Obj.Header.Machine); }
 
   uint32_t getFileAlignment() const {
     return Obj.OptionalHeader->Header.FileAlignment;
@@ -598,13 +594,28 @@ size_t COFFYAML::SectionDataEntry::size() const {
   size_t Size = Binary.binary_size();
   if (UInt32)
     Size += sizeof(*UInt32);
+  if (LoadConfig32)
+    Size += LoadConfig32->Size;
+  if (LoadConfig64)
+    Size += LoadConfig64->Size;
   return Size;
 }
 
+template <typename T> static void writeLoadConfig(T &S, raw_ostream &OS) {
+  OS.write(reinterpret_cast<const char *>(&S),
+           std::min(sizeof(S), static_cast<size_t>(S.Size)));
+  if (sizeof(S) < S.Size)
+    OS.write_zeros(S.Size - sizeof(S));
+}
+
 void COFFYAML::SectionDataEntry::writeAsBinary(raw_ostream &OS) const {
   if (UInt32)
     OS << binary_le(*UInt32);
   Binary.writeAsBinary(OS);
+  if (LoadConfig32)
+    writeLoadConfig(*LoadConfig32, OS);
+  if (LoadConfig64)
+    writeLoadConfig(*LoadConfig64, OS);
 }
 
 namespace llvm {

diff  --git a/llvm/lib/ObjectYAML/COFFYAML.cpp b/llvm/lib/ObjectYAML/COFFYAML.cpp
index 5ef634cbf1ed52..3fe2ea5af08f25 100644
--- a/llvm/lib/ObjectYAML/COFFYAML.cpp
+++ b/llvm/lib/ObjectYAML/COFFYAML.cpp
@@ -547,10 +547,100 @@ void MappingTraits<COFF::AuxiliaryCLRToken>::mapping(
   IO.mapRequired("SymbolTableIndex", ACT.SymbolTableIndex);
 }
 
+void MappingTraits<object::coff_load_config_code_integrity>::mapping(
+    IO &IO, object::coff_load_config_code_integrity &S) {
+  IO.mapOptional("Flags", S.Flags);
+  IO.mapOptional("Catalog", S.Catalog);
+  IO.mapOptional("CatalogOffset", S.CatalogOffset);
+}
+
+template <typename T, typename M>
+void mapLoadConfigMember(IO &IO, T &LoadConfig, const char *Name, M &Member) {
+  // Map only members that match a specified size.
+  if (reinterpret_cast<char *>(&Member) -
+          reinterpret_cast<char *>(&LoadConfig) <
+      LoadConfig.Size)
+    IO.mapOptional(Name, Member);
+}
+
+template <typename T> void mapLoadConfig(IO &IO, T &LoadConfig) {
+  IO.mapOptional("Size", LoadConfig.Size,
+                 support::ulittle32_t(sizeof(LoadConfig)));
+  // The size must be large enough to fit at least the size member itself.
+  if (LoadConfig.Size < sizeof(LoadConfig.Size)) {
+    IO.setError("Size must be at least " + Twine(sizeof(LoadConfig.Size)));
+    return;
+  }
+
+#define MCase(X) mapLoadConfigMember(IO, LoadConfig, #X, LoadConfig.X)
+  MCase(TimeDateStamp);
+  MCase(MajorVersion);
+  MCase(MinorVersion);
+  MCase(GlobalFlagsClear);
+  MCase(GlobalFlagsSet);
+  MCase(CriticalSectionDefaultTimeout);
+  MCase(DeCommitFreeBlockThreshold);
+  MCase(DeCommitTotalFreeThreshold);
+  MCase(LockPrefixTable);
+  MCase(MaximumAllocationSize);
+  MCase(VirtualMemoryThreshold);
+  MCase(ProcessAffinityMask);
+  MCase(ProcessHeapFlags);
+  MCase(CSDVersion);
+  MCase(DependentLoadFlags);
+  MCase(EditList);
+  MCase(SecurityCookie);
+  MCase(SEHandlerTable);
+  MCase(SEHandlerCount);
+  MCase(GuardCFCheckFunction);
+  MCase(GuardCFCheckDispatch);
+  MCase(GuardCFFunctionTable);
+  MCase(GuardCFFunctionCount);
+  MCase(GuardFlags);
+  MCase(CodeIntegrity);
+  MCase(GuardAddressTakenIatEntryTable);
+  MCase(GuardAddressTakenIatEntryCount);
+  MCase(GuardLongJumpTargetTable);
+  MCase(GuardLongJumpTargetCount);
+  MCase(DynamicValueRelocTable);
+  MCase(CHPEMetadataPointer);
+  MCase(GuardRFFailureRoutine);
+  MCase(GuardRFFailureRoutineFunctionPointer);
+  MCase(DynamicValueRelocTableOffset);
+  MCase(DynamicValueRelocTableSection);
+  MCase(GuardRFVerifyStackPointerFunctionPointer);
+  MCase(HotPatchTableOffset);
+  MCase(EnclaveConfigurationPointer);
+  MCase(VolatileMetadataPointer);
+  MCase(GuardEHContinuationTable);
+  MCase(GuardEHContinuationCount);
+  MCase(GuardXFGCheckFunctionPointer);
+  MCase(GuardXFGDispatchFunctionPointer);
+  MCase(GuardXFGTableDispatchFunctionPointer);
+  MCase(CastGuardOsDeterminedFailureMode);
+#undef MCase
+}
+
+void MappingTraits<object::coff_load_configuration32>::mapping(
+    IO &IO, object::coff_load_configuration32 &S) {
+  mapLoadConfig(IO, S);
+}
+
+void MappingTraits<object::coff_load_configuration64>::mapping(
+    IO &IO, object::coff_load_configuration64 &S) {
+  mapLoadConfig(IO, S);
+}
+
 void MappingTraits<COFFYAML::SectionDataEntry>::mapping(
     IO &IO, COFFYAML::SectionDataEntry &E) {
   IO.mapOptional("UInt32", E.UInt32);
   IO.mapOptional("Binary", E.Binary);
+
+  COFF::header &H = *static_cast<COFF::header *>(IO.getContext());
+  if (COFF::is64Bit(H.Machine))
+    IO.mapOptional("LoadConfig", E.LoadConfig64);
+  else
+    IO.mapOptional("LoadConfig", E.LoadConfig32);
 }
 
 void MappingTraits<COFFYAML::Symbol>::mapping(IO &IO, COFFYAML::Symbol &S) {

diff  --git a/llvm/test/tools/llvm-readobj/arm64ec-chpe.yaml b/llvm/test/tools/llvm-readobj/arm64ec-chpe.yaml
index e3758da799bd36..2aa80df0820e90 100644
--- a/llvm/test/tools/llvm-readobj/arm64ec-chpe.yaml
+++ b/llvm/test/tools/llvm-readobj/arm64ec-chpe.yaml
@@ -39,7 +39,9 @@ sections:
     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
     VirtualAddress:  0x4000
     VirtualSize:     328
-    SectionData:     '40010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050008001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+    StructuredData:
+      - LoadConfig:
+          CHPEMetadataPointer: 0x180005000
   - Name:            .data
     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
     VirtualAddress:  0x5000

diff  --git a/llvm/test/tools/yaml2obj/COFF/load-config.yaml b/llvm/test/tools/yaml2obj/COFF/load-config.yaml
new file mode 100644
index 00000000000000..36c66e6d692711
--- /dev/null
+++ b/llvm/test/tools/yaml2obj/COFF/load-config.yaml
@@ -0,0 +1,320 @@
+## Test all members of 64-bit load config.
+# RUN: yaml2obj --docnum=1 %s -o %t
+# RUN: llvm-readobj --coff-load-config %t | FileCheck %s --check-prefix=ALL
+
+# ALL:      Format: COFF-x86-64
+# ALL-NEXT: Arch: x86_64
+# ALL-NEXT: AddressSize: 64bit
+# ALL-NEXT: LoadConfig [
+# ALL-NEXT:   Size: 0x150
+# ALL-NEXT:   TimeDateStamp: 1970-01-01 00:00:01 (0x1)
+# ALL-NEXT:   MajorVersion: 0x2
+# ALL-NEXT:   MinorVersion: 0x3
+# ALL-NEXT:   GlobalFlagsClear: 0x4
+# ALL-NEXT:   GlobalFlagsSet: 0x5
+# ALL-NEXT:   CriticalSectionDefaultTimeout: 0x6
+# ALL-NEXT:   DeCommitFreeBlockThreshold: 0x7
+# ALL-NEXT:   DeCommitTotalFreeThreshold: 0x8
+# ALL-NEXT:   LockPrefixTable: 0x9
+# ALL-NEXT:   MaximumAllocationSize: 0x100000
+# ALL-NEXT:   VirtualMemoryThreshold: 0x2000000
+# ALL-NEXT:   ProcessHeapFlags: 0x2
+# ALL-NEXT:   ProcessAffinityMask: 0x1
+# ALL-NEXT:   CSDVersion: 0x3
+# ALL-NEXT:   DependentLoadFlags: 0x4
+# ALL-NEXT:   EditList: 0x5
+# ALL-NEXT:   SecurityCookie: 0x6
+# ALL-NEXT:   SEHandlerTable: 0x0
+# ALL-NEXT:   SEHandlerCount: 0
+# ALL-NEXT:   GuardCFCheckFunction: 0x9
+# ALL-NEXT:   GuardCFCheckDispatch: 0x1
+# ALL-NEXT:   GuardCFFunctionTable: 0x0
+# ALL-NEXT:   GuardCFFunctionCount: 0
+# ALL-NEXT:   GuardFlags [ (0x4)
+# ALL-NEXT:   ]
+# ALL-NEXT:   GuardAddressTakenIatEntryTable: 0x0
+# ALL-NEXT:   GuardAddressTakenIatEntryCount: 0
+# ALL-NEXT:   GuardLongJumpTargetTable: 0x0
+# ALL-NEXT:   GuardLongJumpTargetCount: 0
+# ALL-NEXT:   DynamicValueRelocTable: 0x2
+# ALL-NEXT:   CHPEMetadataPointer: 0x0
+# ALL-NEXT:   GuardRFFailureRoutine: 0x4
+# ALL-NEXT:   GuardRFFailureRoutineFunctionPointer: 0x5
+# ALL-NEXT:   DynamicValueRelocTableOffset: 0x6
+# ALL-NEXT:   DynamicValueRelocTableSection: 7
+# ALL-NEXT:   GuardRFVerifyStackPointerFunctionPointer: 0x8
+# ALL-NEXT:   HotPatchTableOffset: 0x9
+# ALL-NEXT:   EnclaveConfigurationPointer: 0x1
+# ALL-NEXT:   VolatileMetadataPointer: 0x2
+# ALL-NEXT:   GuardEHContinuationTable: 0x0
+# ALL-NEXT:   GuardEHContinuationCount: 0
+# ALL-NEXT: ]
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x180000000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     320
+    StructuredData:
+      - LoadConfig:
+          Size: 0x150
+          TimeDateStamp: 1
+          MajorVersion: 2
+          MinorVersion: 3
+          GlobalFlagsClear: 4
+          GlobalFlagsSet: 5
+          CriticalSectionDefaultTimeout: 6
+          DeCommitFreeBlockThreshold: 7
+          DeCommitTotalFreeThreshold: 8
+          LockPrefixTable: 9
+          MaximumAllocationSize: 0x100000
+          VirtualMemoryThreshold: 0x2000000
+          ProcessAffinityMask: 1
+          ProcessHeapFlags: 2
+          CSDVersion: 3
+          DependentLoadFlags: 4
+          EditList: 5
+          SecurityCookie: 6
+          SEHandlerTable: 0
+          SEHandlerCount: 0
+          GuardCFCheckFunction: 9
+          GuardCFCheckDispatch: 1
+          GuardCFFunctionTable: 0
+          GuardCFFunctionCount: 0
+          GuardFlags: 4
+          CodeIntegrity:
+            Flags: 0x100
+            Catalog: 5
+            CatalogOffset: 6
+          GuardAddressTakenIatEntryTable: 0
+          GuardAddressTakenIatEntryCount: 0
+          GuardLongJumpTargetTable: 0
+          GuardLongJumpTargetCount: 0
+          DynamicValueRelocTable: 2
+          CHPEMetadataPointer: 0
+          GuardRFFailureRoutine: 4
+          GuardRFFailureRoutineFunctionPointer: 5
+          DynamicValueRelocTableOffset: 6
+          DynamicValueRelocTableSection: 7
+          GuardRFVerifyStackPointerFunctionPointer: 8
+          HotPatchTableOffset: 9
+          EnclaveConfigurationPointer: 1
+          VolatileMetadataPointer: 2
+          GuardEHContinuationTable: 0
+          GuardEHContinuationCount: 0
+          GuardXFGCheckFunctionPointer: 5
+          GuardXFGDispatchFunctionPointer: 6
+          GuardXFGTableDispatchFunctionPointer: 7
+          CastGuardOsDeterminedFailureMode: 8
+symbols: []
+...
+
+## Simple 32-bit load config.
+# RUN: yaml2obj --docnum=2 %s -o %t
+# RUN: llvm-readobj --coff-load-config %t | FileCheck %s --check-prefix=LOADCFG32
+
+# LOADCFG32: LoadConfig [
+# LOADCFG32:   MaximumAllocationSize: 0x100000
+# LOADCFG32:   VirtualMemoryThreshold: 0x2000000
+# LOADCFG32:   CHPEMetadataPointer: 0
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x180000000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_I386
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     320
+    StructuredData:
+      - LoadConfig:
+          MaximumAllocationSize: 0x100000
+          VirtualMemoryThreshold: 0x2000000
+symbols: []
+...
+
+## Create load config with all fields using default values.
+# RUN: yaml2obj --docnum=3 %s -o %t
+# RUN: llvm-readobj --coff-load-config %t | FileCheck %s --check-prefix=DEF
+
+# DEF: Format: COFF-x86-64
+# DEF: Arch: x86_64
+# DEF: AddressSize: 64bit
+# DEF: LoadConfig [
+# DEF:   Size: 0x138
+# DEF:   MajorVersion: 0x0
+# DEF:   MinorVersion: 0x0
+# DEF:   GuardEHContinuationCount: 0
+# DEF: ]
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x180000000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     320
+    StructuredData:
+      - LoadConfig:
+symbols: []
+...
+
+## Create laod config larger than coff_load_configuration32 struct.
+# RUN: yaml2obj --docnum=4 %s -o %t
+# RUN: llvm-readobj --hex-dump=.rdata %t | FileCheck %s --check-prefix=LARGE
+
+# LARGE:      0x00401000 d0000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401010 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401020 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401030 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401040 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401050 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401060 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401070 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401080 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x00401090 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x004010a0 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x004010b0 00000000 00000000 ff000000 00000000 ................
+# LARGE-NEXT: 0x004010c0 00000000 00000000 00000000 00000000 ................
+# LARGE-NEXT: 0x004010d0 aabbccdd                            ....
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x400000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_I386
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     0xd4
+    StructuredData:
+      - LoadConfig:
+          Size: 0xd0
+          CastGuardOsDeterminedFailureMode: 0xff
+      - UInt32: 0xddccbbaa
+symbols: []
+...
+
+## Try to specify load config field that barely fits the specified size.
+# RUN: yaml2obj --docnum=5 %s -o %t
+# RUN: llvm-readobj --hex-dump=.rdata %t | FileCheck %s --check-prefix=SMALL
+# SMALL: 0x180001000 09000000 00000000 aaffffff ff
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x180000000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     13
+    StructuredData:
+      - LoadConfig:
+          Size: 9
+          MajorVersion: 0xbbaa
+      - UInt32: 0xffffffff
+symbols: []
+...
+
+## Try to specify load config field that does not fit specified size.
+# RUN: not yaml2obj --docnum=6 %s -o %t 2>&1 | FileCheck %s --check-prefix=TOOSMALL
+# TOOSMALL: error: unknown key 'MajorVersion'
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x180000000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     320
+    StructuredData:
+      - LoadConfig:
+          Size: 8
+          MajorVersion: 10
+symbols: []
+...
+
+## Set load config size to 0.
+# RUN: not yaml2obj --docnum=7 %s -o %t 2>&1 | FileCheck %s --check-prefix=ZERO
+# ZERO: error: Size must be at least 4
+
+--- !COFF
+OptionalHeader:
+  ImageBase:        0x180000000
+  SectionAlignment: 4096
+  FileAlignment:    512
+  DLLCharacteristics: [ ]
+  LoadConfigTable:
+    RelativeVirtualAddress: 0x1000
+    Size:            320
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ]
+sections:
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+    VirtualAddress:  0x1000
+    VirtualSize:     320
+    StructuredData:
+      - LoadConfig:
+          Size: 0
+symbols: []
+...


        


More information about the llvm-commits mailing list