|
| 1 | +# Make a DLL that exports exportfn1. |
| 2 | +# RUN: yaml2obj %p/Inputs/export.yaml -o %basename_t-exp.obj |
| 3 | +# RUN: lld-link /out:%basename_t-exp.dll /dll %basename_t-exp.obj /export:exportfn1 /implib:%basename_t-exp.lib |
| 4 | +# RUN: split-file %s %t |
| 5 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/main.s -filetype=obj -o %t/main.obj |
| 6 | + |
| 7 | +# RUN: lld-link %t/main.obj -guard:cf,longjmp,ehcont -out:%t-missing.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_MISSING |
| 8 | +# WARN_MISSING: warning: Control Flow Guard is enabled but '_load_config_used' is missing |
| 9 | + |
| 10 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-invalid.s -filetype=obj -o %t/loadcfg-invalid.obj |
| 11 | +# RUN: lld-link %t/main.obj %t/loadcfg-invalid.obj -guard:cf,longjmp,ehcont -out:%t-invalid.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_INVALID |
| 12 | +# WARN_INVALID: warning: GuardCFFunctionTable not set correctly in '_load_config_used' |
| 13 | +# WARN_INVALID-NEXT: warning: GuardCFFunctionCount not set correctly in '_load_config_used' |
| 14 | +# WARN_INVALID-NEXT: warning: GuardFlags not set correctly in '_load_config_used' |
| 15 | +# WARN_INVALID-NEXT: warning: GuardAddressTakenIatEntryTable not set correctly in '_load_config_used' |
| 16 | +# WARN_INVALID-NEXT: warning: GuardAddressTakenIatEntryCount not set correctly in '_load_config_used' |
| 17 | +# WARN_INVALID-NEXT: warning: GuardLongJumpTargetTable not set correctly in '_load_config_used' |
| 18 | +# WARN_INVALID-NEXT: warning: GuardLongJumpTargetCount not set correctly in '_load_config_used' |
| 19 | +# WARN_INVALID-NEXT: warning: GuardEHContinuationTable not set correctly in '_load_config_used' |
| 20 | +# WARN_INVALID-NEXT: warning: GuardEHContinuationCount not set correctly in '_load_config_used' |
| 21 | + |
| 22 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-small112.s -filetype=obj -o %t/loadcfg-small112.obj |
| 23 | +# RUN: lld-link %t/main.obj %t/loadcfg-small112.obj -guard:cf,longjmp -out:%t-small112.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_SMALL_112 |
| 24 | +# WARN_SMALL_112: warning: '_load_config_used' structure too small to include GuardFlags |
| 25 | + |
| 26 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-small148.s -filetype=obj -o %t/loadcfg-small148.obj |
| 27 | +# RUN: lld-link %t/main.obj %t/loadcfg-small148.obj -guard:cf,longjmp -out:%t-small148.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_SMALL_148 |
| 28 | +# WARN_SMALL_148: warning: '_load_config_used' structure too small to include GuardLongJumpTargetCount |
| 29 | + |
| 30 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-small244.s -filetype=obj -o %t/loadcfg-small244.obj |
| 31 | +# RUN: lld-link %t/main.obj %t/loadcfg-small244.obj -guard:cf,longjmp,ehcont -out:%t-small244.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_SMALL_244 |
| 32 | +# WARN_SMALL_244: warning: '_load_config_used' structure too small to include GuardEHContinuationCount |
| 33 | + |
| 34 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-misaligned1.s -filetype=obj -o %t/loadcfg-misaligned1.obj |
| 35 | +# RUN: lld-link %t/main.obj %t/loadcfg-misaligned1.obj -guard:cf,longjmp,ehcont -out:%t-misaligned1.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_ALIGN1 |
| 36 | +# WARN_ALIGN1: warning: '_load_config_used' is misaligned (expected alignment to be 8 bytes, got 4 instead) |
| 37 | + |
| 38 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-misaligned2.s -filetype=obj -o %t/loadcfg-misaligned2.obj |
| 39 | +# RUN: lld-link %t/main.obj %t/loadcfg-misaligned2.obj -guard:cf,longjmp,ehcont -out:%t-misaligned2.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=WARN_ALIGN2 |
| 40 | +# WARN_ALIGN2: warning: '_load_config_used' is misaligned (RVA is 0x{{[0-9A-F]*}}2 not aligned to 8 bytes) |
| 41 | + |
| 42 | +# RUN: llvm-mc -triple x86_64-windows-msvc %t/loadcfg-full.s -filetype=obj -o %t/loadcfg-full.obj |
| 43 | +# RUN: lld-link %t/main.obj %t/loadcfg-full.obj -guard:cf,longjmp,ehcont -out:%t.exe -entry:main %basename_t-exp.lib 2>&1 | FileCheck %s --check-prefix=NOWARN --allow-empty |
| 44 | +# NOWARN-NOT: warning |
| 45 | + |
| 46 | +# Sanity check to make sure the no-warn version has the expected data. |
| 47 | +# RUN: llvm-readobj --file-headers --coff-load-config %t.exe | FileCheck --check-prefix=CHECK %s |
| 48 | +# CHECK: ImageBase: 0x140000000 |
| 49 | +# CHECK: LoadConfig [ |
| 50 | +# CHECK: SEHandlerTable: 0x0 |
| 51 | +# CHECK: SEHandlerCount: 0 |
| 52 | +# CHECK: GuardCFCheckFunction: 0x0 |
| 53 | +# CHECK: GuardCFCheckDispatch: 0x0 |
| 54 | +# CHECK: GuardCFFunctionTable: 0x14000{{([0-9A-F]{4})}} |
| 55 | +# CHECK: GuardCFFunctionCount: 1 |
| 56 | +# CHECK: GuardFlags [ (0x410500) |
| 57 | +# CHECK: CF_FUNCTION_TABLE_PRESENT (0x400) |
| 58 | +# CHECK: CF_INSTRUMENTED (0x100) |
| 59 | +# CHECK: CF_LONGJUMP_TABLE_PRESENT (0x10000) |
| 60 | +# CHECK: EH_CONTINUATION_TABLE_PRESENT (0x400000) |
| 61 | +# CHECK: ] |
| 62 | +# CHECK: GuardAddressTakenIatEntryTable: 0x14000{{([0-9A-F]{4})}} |
| 63 | +# CHECK: GuardAddressTakenIatEntryCount: 1 |
| 64 | +# CHECK: GuardLongJumpTargetTable: 0x14000{{([0-9A-F]{4})}} |
| 65 | +# CHECK: GuardLongJumpTargetCount: 1 |
| 66 | +# CHECK: GuardEHContinuationTable: 0x14000{{([0-9A-F]{4})}} |
| 67 | +# CHECK: GuardEHContinuationCount: 1 |
| 68 | +# CHECK: ] |
| 69 | +# CHECK-NEXT: GuardFidTable [ |
| 70 | +# CHECK-NEXT: 0x14000{{([0-9A-F]{4})}} |
| 71 | +# CHECK-NEXT: ] |
| 72 | +# CHECK-NEXT: GuardIatTable [ |
| 73 | +# CHECK-NEXT: 0x14000{{([0-9A-F]{4})}} |
| 74 | +# CHECK-NEXT: ] |
| 75 | +# CHECK-NEXT: GuardLJmpTable [ |
| 76 | +# CHECK-NEXT: 0x14000{{([0-9A-F]{4})}} |
| 77 | +# CHECK-NEXT: ] |
| 78 | +# CHECK-NEXT: GuardEHContTable [ |
| 79 | +# CHECK-NEXT: 0x14000{{([0-9A-F]{4})}} |
| 80 | +# CHECK-NEXT: ] |
| 81 | + |
| 82 | + |
| 83 | +#--- main.s |
| 84 | + |
| 85 | +# We need @feat.00 to have 0x4000 | 0x800 to indicate /guard:cf and /guard:ehcont. |
| 86 | + .def @feat.00; |
| 87 | + .scl 3; |
| 88 | + .type 0; |
| 89 | + .endef |
| 90 | + .globl @feat.00 |
| 91 | +@feat.00 = 0x4800 |
| 92 | + .def main; .scl 2; .type 32; .endef |
| 93 | + .globl main # -- Begin function main |
| 94 | + .p2align 4, 0x90 |
| 95 | +main: |
| 96 | + mov %eax, %eax |
| 97 | + movq __imp_exportfn1(%rip), %rax |
| 98 | + callq *%rax |
| 99 | + nop |
| 100 | +# Fake setjmp target |
| 101 | +$cfgsj_main0: |
| 102 | + mov %ebx, %ebx |
| 103 | + nop |
| 104 | +# Fake ehcont target |
| 105 | +$ehgcr_0_1: |
| 106 | + mov %ecx, %ecx |
| 107 | + nop |
| 108 | + retq |
| 109 | + # -- End function |
| 110 | + .section .gfids$y,"dr" |
| 111 | + .symidx main |
| 112 | + .section .giats$y,"dr" |
| 113 | + .symidx __imp_exportfn1 |
| 114 | + .section .gljmp$y,"dr" |
| 115 | + .symidx $cfgsj_main0 |
| 116 | + .section .gehcont$y,"dr" |
| 117 | + .symidx $ehgcr_0_1 |
| 118 | + .addrsig_sym main |
| 119 | + .addrsig_sym __imp_exportfn1 |
| 120 | + .section .rdata,"dr" |
| 121 | + |
| 122 | +#--- loadcfg-invalid.s |
| 123 | + |
| 124 | +.globl _load_config_used |
| 125 | + .p2align 3 |
| 126 | +_load_config_used: |
| 127 | + .long 312 |
| 128 | + .fill 308, 1, 0 |
| 129 | + |
| 130 | +#--- loadcfg-small112.s |
| 131 | + |
| 132 | +.globl _load_config_used |
| 133 | + .p2align 3 |
| 134 | +_load_config_used: |
| 135 | + .long 112 |
| 136 | + .fill 108, 1, 0 |
| 137 | + |
| 138 | +#--- loadcfg-small148.s |
| 139 | + |
| 140 | +.globl _load_config_used |
| 141 | + .p2align 3 |
| 142 | +_load_config_used: |
| 143 | + .long 148 |
| 144 | + .fill 124, 1, 0 |
| 145 | + .quad __guard_fids_table |
| 146 | + .quad __guard_fids_count |
| 147 | + .long __guard_flags |
| 148 | + |
| 149 | +#--- loadcfg-small244.s |
| 150 | + |
| 151 | +.globl _load_config_used |
| 152 | + .p2align 3 |
| 153 | +_load_config_used: |
| 154 | + .long 244 |
| 155 | + .fill 124, 1, 0 |
| 156 | + .quad __guard_fids_table |
| 157 | + .quad __guard_fids_count |
| 158 | + .long __guard_flags |
| 159 | + .fill 12, 1, 0 |
| 160 | + .quad __guard_iat_table |
| 161 | + .quad __guard_iat_count |
| 162 | + .quad __guard_longjmp_table |
| 163 | + .quad __guard_longjmp_count |
| 164 | + .fill 52, 1, 0 # Up to HotPatchTableOffset |
| 165 | + |
| 166 | +#--- loadcfg-misaligned1.s |
| 167 | + |
| 168 | +.globl _load_config_used |
| 169 | + .fill 2, 1, 0 # offset by 2 |
| 170 | + .p2align 2 # then align to 0x04 |
| 171 | +_load_config_used: |
| 172 | + .long 312 |
| 173 | + .fill 124, 1, 0 |
| 174 | + .quad __guard_fids_table |
| 175 | + .quad __guard_fids_count |
| 176 | + .long __guard_flags |
| 177 | + .fill 12, 1, 0 |
| 178 | + .quad __guard_iat_table |
| 179 | + .quad __guard_iat_count |
| 180 | + .quad __guard_longjmp_table |
| 181 | + .quad __guard_longjmp_count |
| 182 | + .fill 72, 1, 0 |
| 183 | + .quad __guard_eh_cont_table |
| 184 | + .quad __guard_eh_cont_count |
| 185 | + .fill 32, 1, 0 |
| 186 | + |
| 187 | +#--- loadcfg-misaligned2.s |
| 188 | + |
| 189 | +.globl _load_config_used |
| 190 | + .p2align 4 # align to 0x10 |
| 191 | + .fill 2, 1, 0 # then offset by 2 |
| 192 | +_load_config_used: |
| 193 | + .long 312 |
| 194 | + .fill 124, 1, 0 |
| 195 | + .quad __guard_fids_table |
| 196 | + .quad __guard_fids_count |
| 197 | + .long __guard_flags |
| 198 | + .fill 12, 1, 0 |
| 199 | + .quad __guard_iat_table |
| 200 | + .quad __guard_iat_count |
| 201 | + .quad __guard_longjmp_table |
| 202 | + .quad __guard_longjmp_count |
| 203 | + .fill 72, 1, 0 |
| 204 | + .quad __guard_eh_cont_table |
| 205 | + .quad __guard_eh_cont_count |
| 206 | + .fill 32, 1, 0 |
| 207 | + |
| 208 | +#--- loadcfg-full.s |
| 209 | + |
| 210 | +.globl _load_config_used |
| 211 | + .p2align 3 |
| 212 | +_load_config_used: |
| 213 | + .long 312 |
| 214 | + .fill 124, 1, 0 |
| 215 | + .quad __guard_fids_table |
| 216 | + .quad __guard_fids_count |
| 217 | + .long __guard_flags |
| 218 | + .fill 12, 1, 0 |
| 219 | + .quad __guard_iat_table |
| 220 | + .quad __guard_iat_count |
| 221 | + .quad __guard_longjmp_table |
| 222 | + .quad __guard_longjmp_count |
| 223 | + .fill 72, 1, 0 |
| 224 | + .quad __guard_eh_cont_table |
| 225 | + .quad __guard_eh_cont_count |
| 226 | + .fill 32, 1, 0 |
0 commit comments