Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lld/COFF/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,10 @@ struct Configuration {
bool dynamicBase = true;
bool allowBind = true;
bool cetCompat = false;
bool cetCompatStrict = false;
bool cetCompatIpValidationRelaxed = false;
bool cetCompatDynamicApisInProcOnly = false;
bool hotpatchCompat = false;
bool nxCompat = true;
bool allowIsolation = true;
bool terminalServerAware = true;
Expand Down
8 changes: 8 additions & 0 deletions lld/COFF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2145,6 +2145,14 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
config->integrityCheck =
args.hasFlag(OPT_integritycheck, OPT_integritycheck_no, false);
config->cetCompat = args.hasFlag(OPT_cetcompat, OPT_cetcompat_no, false);
config->cetCompatStrict =
args.hasFlag(OPT_cetcompatstrict, OPT_cetcompatstrict_no, false);
config->cetCompatIpValidationRelaxed = args.hasFlag(
OPT_cetipvalidationrelaxed, OPT_cetipvalidationrelaxed_no, false);
config->cetCompatDynamicApisInProcOnly = args.hasFlag(
OPT_cetdynamicapisinproc, OPT_cetdynamicapisinproc_no, false);
config->hotpatchCompat =
args.hasFlag(OPT_hotpatchcompatible, OPT_hotpatchcompatible_no, false);
config->nxCompat = args.hasFlag(OPT_nxcompat, OPT_nxcompat_no, true);
for (auto *arg : args.filtered(OPT_swaprun))
parseSwaprun(arg->getValue());
Expand Down
8 changes: 8 additions & 0 deletions lld/COFF/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,14 @@ defm appcontainer : B<"appcontainer",
"Image can run outside an app container (default)">;
defm cetcompat : B<"cetcompat", "Mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack",
"Don't mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack (default)">;
defm cetcompatstrict : B<"cetcompatstrict", "Mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack in strict mode",
"Don't mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack in strict mode (default)">;
defm cetipvalidationrelaxed : B<"cetipvalidationrelaxed", "Mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack with relaxed context IP validation",
"Don't mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack with relaxed context IP validation (default)">;
defm cetdynamicapisinproc : B<"cetdynamicapisinproc", "Mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack in such a way that dynamic APIs allowed in process",
"Don't mark executable image as compatible with Control-flow Enforcement Technology (CET) Shadow Stack with dynamic APIs allowed in process (default)">;
defm hotpatchcompatible : B<"hotpatchcompatible", "Mark executable image as compatible with hotpatch",
"Don't mark executable image as compatible with hotpatch (default)">;
defm dynamicbase : B<"dynamicbase", "Enable ASLR (default unless /fixed)",
"Disable ASLR (default when /fixed)">;
defm fixed : B<"fixed", "Disable base relocations",
Expand Down
31 changes: 27 additions & 4 deletions lld/COFF/Writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1216,7 +1216,9 @@ void Writer::createMiscChunks() {
// Create Debug Information Chunks
debugInfoSec = config->mingw ? buildidSec : rdataSec;
if (config->buildIDHash != BuildIDHash::None || config->debug ||
config->repro || config->cetCompat) {
config->repro || config->cetCompat || config->cetCompatStrict ||
config->cetCompatIpValidationRelaxed ||
config->cetCompatDynamicApisInProcOnly || config->hotpatchCompat) {
debugDirectory =
make<DebugDirectoryChunk>(ctx, debugRecords, config->repro);
debugDirectory->setAlignment(4);
Expand All @@ -1237,10 +1239,31 @@ void Writer::createMiscChunks() {
});
}

uint16_t ex_characteristics_flags = 0;
if (config->cetCompat) {
debugRecords.emplace_back(COFF::IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS,
make<ExtendedDllCharacteristicsChunk>(
IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT));
ex_characteristics_flags |= IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT;
}
if (config->cetCompatStrict) {
ex_characteristics_flags |=
IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE;
}
if (config->cetCompatIpValidationRelaxed) {
ex_characteristics_flags |=
IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE;
}
if (config->cetCompatDynamicApisInProcOnly) {
ex_characteristics_flags |=
IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY;
}
if (config->hotpatchCompat) {
ex_characteristics_flags |=
IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE;
}

if (ex_characteristics_flags) {
debugRecords.emplace_back(
COFF::IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS,
make<ExtendedDllCharacteristicsChunk>(ex_characteristics_flags));
}

// Align and add each chunk referenced by the debug data directory.
Expand Down
15 changes: 15 additions & 0 deletions lld/test/COFF/cetcompat.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetcompat %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x1)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT (0x1)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 01000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions lld/test/COFF/cetcompatstrict.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetcompatstrict %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x2)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE (0x2)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 02000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions lld/test/COFF/cetdynamicapisinproc.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetdynamicapisinproc %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x8)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY (0x8)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 08000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions lld/test/COFF/cetipvalidationrelaxed.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetipvalidationrelaxed %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x4)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE (0x4)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 04000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions lld/test/COFF/hotpatchcompatible.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x80)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE (0x80)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 80000000 |....|
CHECK: )
CHECK: }

40 changes: 40 additions & 0 deletions lld/test/COFF/options.test
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,46 @@ CETCOMPAT: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETCOMPAT %s
NONCETCOMPAT-NOT: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT

# RUN: lld-link /out:%t.exe /entry:main /cetcompatstrict %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CETCOMPATSTRICT %s
CETCOMPATSTRICT: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE

# RUN: lld-link /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETCOMPATSTRICT %s
# RUN: lld-link /out:%t.exe /entry:main /cetcompatstrict:no %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETCOMPATSTRICT %s
NONCETCOMPATSTRICT-NOT: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE

# RUN: lld-link /out:%t.exe /entry:main /cetipvalidationrelaxed %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CETCOMPATSTIPVALIDATIONRELAXED %s
CETCOMPATSTIPVALIDATIONRELAXED: IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE

# RUN: lld-link /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETCOMPATSTIPVALIDATIONRELAXED %s
# RUN: lld-link /out:%t.exe /entry:main /cetipvalidationrelaxed:no %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETCOMPATSTIPVALIDATIONRELAXED %s
NONCETCOMPATSTIPVALIDATIONRELAXED-NOT: IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE

# RUN: lld-link /out:%t.exe /entry:main /cetdynamicapisinproc %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CETDYNAMICAPISINPROC %s
CETDYNAMICAPISINPROC: IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY

# RUN: lld-link /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETDYNAMICAPISINPROC %s
# RUN: lld-link /out:%t.exe /entry:main /cetdynamicapisinproc:no %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONCETDYNAMICAPISINPROC %s
NONCETDYNAMICAPISINPROC-NOT: IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY

# RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=HOTPATCHCOMPATIBLE %s
HOTPATCHCOMPATIBLE: IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE

# RUN: lld-link /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONHOTPATCHCOMPATIBLE %s
# RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible:no %t.obj
# RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=NONHOTPATCHCOMPATIBLE %s
NONHOTPATCHCOMPATIBLE-NOT: IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE

# RUN: lld-link /out:%t.exe /entry:main /swaprun:CD %t.obj
# RUN: llvm-readobj --file-headers %t.exe | FileCheck -check-prefix=SWAPCD %s
# RUN: lld-link /out:%t.exe /entry:main /swaprun:cd,net %t.obj
Expand Down
19 changes: 18 additions & 1 deletion llvm/include/llvm/BinaryFormat/COFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,24 @@ enum DLLCharacteristics : unsigned {

enum ExtendedDLLCharacteristics : unsigned {
/// Image is CET compatible
IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT = 0x0001
IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT = 0x0001,
/// Image is CET compatible in strict mode
IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE = 0x0002,
/// Image is CET compatible in such a way that context IP validation is
/// relaxed
IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE =
0x0004,
/// Image is CET compatible in such a way that the use of
/// dynamic APIs is restricted to processes only
IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY = 0x0008,
/// Reserved for future use. Not used by MSVC link.exe
IMAGE_DLL_CHARACTERISTICS_EX_CET_RESERVED_1 = 0x0010,
/// Reserved for future use. Not used by MSVC link.exe
IMAGE_DLL_CHARACTERISTICS_EX_CET_RESERVED_2 = 0x0020,
/// Image is CFI compatible.
IMAGE_DLL_CHARACTERISTICS_EX_FORWARD_CFI_COMPAT = 0x0040,
/// Image is hotpatch compatible.
IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE = 0x0080,
};

enum DebugType : unsigned {
Expand Down
Binary file removed llvm/test/tools/llvm-readobj/COFF/Inputs/has-cet.exe
Binary file not shown.
15 changes: 15 additions & 0 deletions llvm/test/tools/llvm-readobj/COFF/Inputs/hascetret42.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: []
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
SectionData: B82A000000C3 # mov eax, 42; ret
symbols:
- Name: main
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
7 changes: 3 additions & 4 deletions llvm/test/tools/llvm-readobj/COFF/cetcompat.test
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# To regenerate has-cet.exe
# $ echo int main() { return 0; } > has-cet.c
# $ cl has-cet.c /link /cetcompat
RUN: llvm-readobj --coff-debug-directory %p/Inputs/has-cet.exe | FileCheck %s
RUN: yaml2obj %p/Inputs/hascetret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetcompat %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
Expand Down
15 changes: 15 additions & 0 deletions llvm/test/tools/llvm-readobj/COFF/cetcompatstrict.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/hascetret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetcompatstrict %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x2)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE (0x2)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 02000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions llvm/test/tools/llvm-readobj/COFF/cetdynamicapisinproc.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/hascetret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetdynamicapisinproc %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x8)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY (0x8)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 08000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions llvm/test/tools/llvm-readobj/COFF/cetipvalidationrelaxed.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/hascetret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /cetipvalidationrelaxed %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x4)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE (0x4)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 04000000 |....|
CHECK: )
CHECK: }

15 changes: 15 additions & 0 deletions llvm/test/tools/llvm-readobj/COFF/hotpatchcompatible.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RUN: yaml2obj %p/Inputs/hascetret42.yaml -o %t.obj
RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible %t.obj
RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s

CHECK: DebugEntry {
CHECK: Characteristics: 0x0
CHECK: Type: ExtendedDLLCharacteristics (0x14)
CHECK: ExtendedCharacteristics [ (0x80)
CHECK: IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE (0x80)
CHECK: ]
CHECK: RawData (
CHECK: 0000: 80000000 |....|
CHECK: )
CHECK: }

11 changes: 10 additions & 1 deletion llvm/tools/llvm-readobj/COFFDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,10 +412,19 @@ const EnumEntry<COFF::DLLCharacteristics> PEDLLCharacteristics[] = {
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE),
};

// clang-format off
static const EnumEntry<COFF::ExtendedDLLCharacteristics>
PEExtendedDLLCharacteristics[] = {
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT ),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE ),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY ),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_RESERVED_1 ),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_CET_RESERVED_2 ),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_FORWARD_CFI_COMPAT ),
LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE ),
};
// clang-format on

static const EnumEntry<COFF::SectionCharacteristics>
ImageSectionCharacteristics[] = {
Expand Down