[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