# REQUIRES: x86 # RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj # RUN: lld-link %t.obj -guard:cf -guard:ehcont -out:%t.exe -entry:main # RUN: llvm-readobj --file-headers --coff-load-config %t.exe | FileCheck %s # CHECK: ImageBase: 0x140000000 # CHECK: LoadConfig [ # CHECK: SEHandlerTable: 0x0 # CHECK: SEHandlerCount: 0 # CHECK: GuardCFCheckFunction: 0x0 # CHECK: GuardCFCheckDispatch: 0x0 # CHECK: GuardCFFunctionTable: 0x14000{{.*}} # CHECK: GuardCFFunctionCount: 1 # CHECK: GuardFlags [ (0x400500) # CHECK: CF_FUNCTION_TABLE_PRESENT (0x400) # CHECK: CF_INSTRUMENTED (0x100) # CHECK: EH_CONTINUATION_TABLE_PRESENT (0x400000) # CHECK: ] # CHECK: GuardAddressTakenIatEntryTable: 0x0 # CHECK: GuardAddressTakenIatEntryCount: 0 # CHECK: GuardEHContinuationTable: 0x14000{{.*}} # CHECK: GuardEHContinuationCount: 2 # CHECK: ] # CHECK: GuardEHContTable [ # CHECK-NEXT: 0x14000{{.*}} # CHECK-NEXT: 0x14000{{.*}} # CHECK-NEXT: ] # We need @feat.00 to have 0x4000 to indicate /guard:ehcont. .def @feat.00; .scl 3; .type 0; .endef .globl @feat.00 @feat.00 = 0x4000 .def main; .scl 2; .type 32; .endef .globl main # -- Begin function main .p2align 4, 0x90 main: .seh_proc main .seh_handler __C_specific_handler, @unwind, @except .seh_handlerdata .long 2 .long (seh_begin)@IMGREL .long (seh_end)@IMGREL .long 1 .long (seh_except)@IMGREL .long (seh2_begin)@IMGREL .long (seh2_end)@IMGREL .long 1 .long (seh2_except)@IMGREL .text seh_begin: nop int3 nop seh_end: nop seh_except: nop seh2_begin: nop int3 nop seh2_end: nop seh2_except: nop xor %eax, %eax ret .seh_endproc __C_specific_handler: ret .section .gehcont$y,"dr" .symidx seh_except .symidx seh2_except .section .rdata,"dr" .globl _load_config_used _load_config_used: .long 312 .fill 124, 1, 0 .quad __guard_fids_table .quad __guard_fids_count .long __guard_flags .fill 12, 1, 0 .quad __guard_iat_table .quad __guard_iat_count .quad __guard_longjmp_table .quad __guard_longjmp_count .fill 72, 1, 0 .quad __guard_eh_cont_table .quad __guard_eh_cont_count .fill 32, 1, 0