diff options
author | kkent030315 <hrn832@gmail.com> | 2025-07-29 14:51:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-30 00:51:57 +0300 |
commit | 32127045c838fcc2aab816ee9126e69ec5e63135 (patch) | |
tree | ea4fab9cd696dc5bb2526de5509c0f9aabc4992b | |
parent | 86f74c4d019dd705e6890f8c997072293aaaff91 (diff) | |
download | llvm-32127045c838fcc2aab816ee9126e69ec5e63135.zip llvm-32127045c838fcc2aab816ee9126e69ec5e63135.tar.gz llvm-32127045c838fcc2aab816ee9126e69ec5e63135.tar.bz2 |
[llvm-readobj][COFF] Add support for more CET and hotpatch flags (#150967)
- Added `IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE`
- Added
`IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE`
- Added
`IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY`
- Added `IMAGE_DLL_CHARACTERISTICS_EX_CET_RESERVED_1`
- Added `IMAGE_DLL_CHARACTERISTICS_EX_CET_RESERVED_2`
- Added `IMAGE_DLL_CHARACTERISTICS_EX_FORWARD_CFI_COMPAT`
- Added `IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE`
-rw-r--r-- | llvm/include/llvm/BinaryFormat/COFF.h | 19 | ||||
-rw-r--r-- | llvm/test/tools/llvm-readobj/COFF/Inputs/has-cet.exe | bin | 94720 -> 0 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-readobj/COFF/Inputs/has-exdllcharacteristics.exe | bin | 0 -> 5120 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-readobj/COFF/cetcompat.test | 16 | ||||
-rw-r--r-- | llvm/test/tools/llvm-readobj/COFF/exdllcharacteristics.test | 22 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 11 |
6 files changed, 50 insertions, 18 deletions
diff --git a/llvm/include/llvm/BinaryFormat/COFF.h b/llvm/include/llvm/BinaryFormat/COFF.h index f3b5d5e..64fe216 100644 --- a/llvm/include/llvm/BinaryFormat/COFF.h +++ b/llvm/include/llvm/BinaryFormat/COFF.h @@ -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 { diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/has-cet.exe b/llvm/test/tools/llvm-readobj/COFF/Inputs/has-cet.exe Binary files differdeleted file mode 100644 index c77060d..0000000 --- a/llvm/test/tools/llvm-readobj/COFF/Inputs/has-cet.exe +++ /dev/null diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/has-exdllcharacteristics.exe b/llvm/test/tools/llvm-readobj/COFF/Inputs/has-exdllcharacteristics.exe Binary files differnew file mode 100644 index 0000000..9c36817 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/has-exdllcharacteristics.exe diff --git a/llvm/test/tools/llvm-readobj/COFF/cetcompat.test b/llvm/test/tools/llvm-readobj/COFF/cetcompat.test deleted file mode 100644 index a973b5c..0000000 --- a/llvm/test/tools/llvm-readobj/COFF/cetcompat.test +++ /dev/null @@ -1,16 +0,0 @@ -# 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 - -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: } - diff --git a/llvm/test/tools/llvm-readobj/COFF/exdllcharacteristics.test b/llvm/test/tools/llvm-readobj/COFF/exdllcharacteristics.test new file mode 100644 index 0000000..ef35aea --- /dev/null +++ b/llvm/test/tools/llvm-readobj/COFF/exdllcharacteristics.test @@ -0,0 +1,22 @@ +# To regenerate has-exdllcharacteristics.exe +# $ echo int main() { return 0; } > has-exdllcharacteristics.c +# To make minimum possible stub file (to decrease the binary size) +# $ echo -n '4D5A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' | xxd -r -p > stub +# $ cl has-exdllcharacteristics.c /link /entry:main /STUB:stub /NOCOFFGRPINFO /EMITTOOLVERSIONINFO:NO /EMITPOGOPHASEINFO /NOVCFEATURE /MANIFEST:NO /cetcompat /cetcompatstrict /cetdynamicapisinproc /cetipvalidationrelaxed /hotpatchcompatible /functionpadmin:6 +RUN: llvm-readobj --coff-debug-directory %p/Inputs/has-exdllcharacteristics.exe | FileCheck %s + +CHECK: DebugEntry { +CHECK: Characteristics: 0x0 +CHECK: Type: ExtendedDLLCharacteristics (0x14) +CHECK: ExtendedCharacteristics [ (0x8F) +CHECK-DAG: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT (0x1) +CHECK-DAG: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE (0x2) +CHECK-DAG: IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE (0x4) +CHECK-DAG: IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY (0x8) +CHECK-DAG: IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE (0x80) +CHECK: ] +CHECK: RawData ( +CHECK: 0000: 8F000000 |....| +CHECK: ) +CHECK: } + diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index dce8e60..96e0a634 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -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[] = { |