[lld] [llvm] [LLD][COFF] Add more variety of CET and hotpatch flags (PR #150761)

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 30 02:28:23 PDT 2025


================
@@ -0,0 +1,138 @@
+// ---- /cetcompat (image is CET compatible)
+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 -check-prefix=CHECKCETCOMPAT %s
+
+CHECKCETCOMPAT:  DebugEntry {
+CHECKCETCOMPAT:    Characteristics: 0x0
+CHECKCETCOMPAT:    Type: ExtendedDLLCharacteristics (0x14)
+CHECKCETCOMPAT:    ExtendedCharacteristics [ (0x1)
+CHECKCETCOMPAT:      IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT (0x1)
+CHECKCETCOMPAT:    ]
+CHECKCETCOMPAT:    RawData (
+CHECKCETCOMPAT:      0000: 01000000                             |....|
+CHECKCETCOMPAT:    )
+CHECKCETCOMPAT:  }
+
+// ---- /cetcompat:no (image is not CET compatible)
+RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
+RUN: lld-link /out:%t.exe /entry:main /cetcompat:no %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKNOCETCOMPAT %s
+
+CHECKNOCETCOMPAT-NOT: Type: ExtendedDLLCharacteristics (0x14)
+CHECKNOCETCOMPAT-NOT: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT (0x1)
+
+// ---- /cetcompatstrict (CET in strict mode)
+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 -check-prefix=CHECKCETCOMPATSTRICT %s
+
+CHECKCETCOMPATSTRICT:  DebugEntry {
+CHECKCETCOMPATSTRICT:    Characteristics: 0x0
+CHECKCETCOMPATSTRICT:    Type: ExtendedDLLCharacteristics (0x14)
+CHECKCETCOMPATSTRICT:    ExtendedCharacteristics [ (0x2)
+CHECKCETCOMPATSTRICT:      IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE (0x2)
+CHECKCETCOMPATSTRICT:    ]
+CHECKCETCOMPATSTRICT:    RawData (
+CHECKCETCOMPATSTRICT:      0000: 02000000                             |....|
+CHECKCETCOMPATSTRICT:    )
+CHECKCETCOMPATSTRICT:  }
+
+// ---- /cetcompatstrict:no (image is not CET strict mode)
+RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
+RUN: lld-link /out:%t.exe /entry:main /cetcompatstrict:no %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKNOCETSTRICT %s
+
+CHECKNOCETSTRICT-NOT: Type: ExtendedDLLCharacteristics (0x14)
+CHECKNOCETSTRICT-NOT: IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE (0x2)
+
+// ---- /cetdynamicapisinproc
+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 -check-prefix=CHECKCETDYNAPI %s
+
+CHECKCETDYNAPI:  DebugEntry {
+CHECKCETDYNAPI:    Characteristics: 0x0
+CHECKCETDYNAPI:    Type: ExtendedDLLCharacteristics (0x14)
+CHECKCETDYNAPI:    ExtendedCharacteristics [ (0x8)
+CHECKCETDYNAPI:      IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY (0x8)
+CHECKCETDYNAPI:    ]
+CHECKCETDYNAPI:    RawData (
+CHECKCETDYNAPI:      0000: 08000000                             |....|
+CHECKCETDYNAPI:    )
+CHECKCETDYNAPI:  }
+
+// ---- /cetdynamicapisinproc:no (image is not CET dynamic apis allowed in proc)
+RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
+RUN: lld-link /out:%t.exe /entry:main /cetdynamicapisinproc:no %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKNOCETDYNAPI %s
+
+CHECKNOCETDYNAPI-NOT: Type: ExtendedDLLCharacteristics (0x14)
+CHECKNOCETDYNAPI-NOT: Type: IMAGE_DLL_CHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC_ONLY (0x8)
+
+// ---- /cetipvalidationrelaxed (image is not CET in context ip validation relaxed mode)
+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 -check-prefix=CHECKCETIPRELAXED %s
+
+CHECKCETIPRELAXED:  DebugEntry {
+CHECKCETIPRELAXED:    Characteristics: 0x0
+CHECKCETIPRELAXED:    Type: ExtendedDLLCharacteristics (0x14)
+CHECKCETIPRELAXED:    ExtendedCharacteristics [ (0x4)
+CHECKCETIPRELAXED:      IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE (0x4)
+CHECKCETIPRELAXED:    ]
+CHECKCETIPRELAXED:    RawData (
+CHECKCETIPRELAXED:      0000: 04000000                             |....|
+CHECKCETIPRELAXED:    )
+CHECKCETIPRELAXED:  }
+
+// ---- /cetipvalidationrelaxed:no (image is not CET in IP validation relaxed mode)
+RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
+RUN: lld-link /out:%t.exe /entry:main /cetipvalidationrelaxed:no %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKNOCETIPRELAXED %s
+
+CHECKNOCETIPRELAXED-NOT: Type: ExtendedDLLCharacteristics (0x14)
+CHECKNOCETIPRELAXED-NOT: Type: IMAGE_DLL_CHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE (0x4)
+
+// ---- /hotpatchcompatible requires /functionpadmin:6
+RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
+RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible /functionpadmin:6 %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKHOTPATCHABLE %s
+
+CHECKHOTPATCHABLE:  DebugEntry {
+CHECKHOTPATCHABLE:    Characteristics: 0x0
+CHECKHOTPATCHABLE:    Type: ExtendedDLLCharacteristics (0x14)
+CHECKHOTPATCHABLE:    ExtendedCharacteristics [ (0x80)
+CHECKHOTPATCHABLE:      IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE (0x80)
+CHECKHOTPATCHABLE:    ]
+CHECKHOTPATCHABLE:    RawData (
+CHECKHOTPATCHABLE:      0000: 80000000                             |....|
+CHECKHOTPATCHABLE:    )
+CHECKHOTPATCHABLE:  }
+
+// ---- /hotpatchcompatible:no (image is not hotpatch compatible)
+RUN: yaml2obj %p/Inputs/ret42.yaml -o %t.obj
+RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible:no %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKNOHOTPATCHABLE %s
+
+CHECKNOHOTPATCHABLE-NOT: Type: ExtendedDLLCharacteristics (0x14)
+CHECKNOHOTPATCHABLE-NOT: Type: IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE (0x80)
+
+// ---- /hotpatchcompatible more than 6 bytes is accepted
+RUN: lld-link /out:%t.exe /entry:main /hotpatchcompatible /functionpadmin:10 %t.obj
+RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck -check-prefix=CHECKHOTPATCHABLE2 %s
+
+CHECKHOTPATCHABLE2:  DebugEntry {
+CHECKHOTPATCHABLE2:    Characteristics: 0x0
+CHECKHOTPATCHABLE2:    Type: ExtendedDLLCharacteristics (0x14)
+CHECKHOTPATCHABLE2:    ExtendedCharacteristics [ (0x80)
+CHECKHOTPATCHABLE2:      IMAGE_DLL_CHARACTERISTICS_EX_HOTPATCH_COMPATIBLE (0x80)
+CHECKHOTPATCHABLE2:    ]
+CHECKHOTPATCHABLE2:    RawData (
+CHECKHOTPATCHABLE2:      0000: 80000000                             |....|
+CHECKHOTPATCHABLE2:    )
+CHECKHOTPATCHABLE2:  }
+
+// ---- /hotpatchcompatible requires at least 6 bytes function padding
+RUN: env LLD_IN_TEST=1 not lld-link /out:%t.exe /entry:main /hotpatchcompatible /functionpadmin:5 %t.obj 2>&1 | FileCheck -check-prefix=CHECKHOTPATCHNOT %s
----------------
mstorsjo wrote:

I think it'd be valuable to have one test with `/hotpatchcompatible` without setting `/functionpadmin` as well.

https://github.com/llvm/llvm-project/pull/150761


More information about the llvm-commits mailing list