126 lines · plain
1# REQUIRES: x862 3# Make a DLL that exports exportfn1.4# RUN: yaml2obj %p/Inputs/export.yaml -o %basename_t-exp.obj5# RUN: lld-link /out:%basename_t-exp.dll /dll %basename_t-exp.obj /export:exportfn1 /implib:%basename_t-exp.lib6 7# Make an object file that imports exportfn1.8# RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %basename_t.obj9 10# Check that the Guard address-taken IAT entry tables are propagated to the final executable.11# RUN: lld-link %basename_t.obj -guard:cf -guard:longjmp -entry:main -out:%basename_t-nodelay.exe %basename_t-exp.lib12# RUN: llvm-readobj --file-headers --coff-load-config %basename_t-nodelay.exe | FileCheck %s --check-prefix CHECK13 14# CHECK: ImageBase: 0x14000000015# CHECK: LoadConfig [16# CHECK: GuardCFFunctionTable: 0x14000211417# CHECK: GuardCFFunctionCount: 118# CHECK: GuardFlags [ (0x10500)19# CHECK: CF_FUNCTION_TABLE_PRESENT (0x400)20# CHECK: CF_INSTRUMENTED (0x100)21# CHECK: CF_LONGJUMP_TABLE_PRESENT (0x10000)22# CHECK: ]23# CHECK: GuardAddressTakenIatEntryTable: 0x14000211824# CHECK: GuardAddressTakenIatEntryCount: 125# CHECK: ]26# CHECK: GuardFidTable [27# CHECK-NEXT: 0x14000{{.*}}28# CHECK-NEXT: ]29# CHECK: GuardIatTable [30# CHECK-NEXT: 0x14000{{.*}}31# CHECK-NEXT: ]32 33 34# Check that the additional load thunk symbol is added to the GFIDs table.35# RUN: lld-link %basename_t.obj -guard:cf -guard:longjmp -entry:main -out:%basename_t-delay.exe %basename_t-exp.lib -alternatename:__delayLoadHelper2=main -delayload:%basename_t-exp.dll36# RUN: llvm-readobj --file-headers --coff-load-config %basename_t-delay.exe | FileCheck %s --check-prefix DELAY-CHECK37 38# DELAY-CHECK: ImageBase: 0x14000000039# DELAY-CHECK: LoadConfig [40# DELAY-CHECK: GuardCFFunctionTable: 0x14000211C41# DELAY-CHECK: GuardCFFunctionCount: 242# DELAY-CHECK: GuardFlags [ (0x10500)43# DELAY-CHECK: CF_FUNCTION_TABLE_PRESENT (0x400)44# DELAY-CHECK: CF_INSTRUMENTED (0x100)45# DELAY-CHECK: CF_LONGJUMP_TABLE_PRESENT (0x10000)46# DELAY-CHECK: ]47# DELAY-CHECK: GuardAddressTakenIatEntryTable: 0x14000212448# DELAY-CHECK: GuardAddressTakenIatEntryCount: 149# DELAY-CHECK: ]50# DELAY-CHECK: GuardFidTable [51# DELAY-CHECK-NEXT: 0x14000{{.*}}52# DELAY-CHECK-NEXT: 0x14000{{.*}}53# DELAY-CHECK-NEXT: ]54# DELAY-CHECK: GuardIatTable [55# DELAY-CHECK-NEXT: 0x14000{{.*}}56# DELAY-CHECK-NEXT: ]57 58 59# This assembly is reduced from C code like:60# __declspec(noinline)61# void IndirectCall(BOOL (func)(HANDLE)) {62# (*func)(NULL);63# }64# int main(int argc, char** argv) {65# IndirectCall(exportfn1);66# }67 68 .text69 .def @feat.00;70 .scl 3;71 .type 0;72 .endef73 .globl @feat.0074.set @feat.00, 204875 .def IndirectCall; .scl 2; .type 32; .endef76 .globl IndirectCall # -- Begin function IndirectCall77 .p2align 4, 0x9078IndirectCall: # @IndirectCall79# %bb.0:80 subq $40, %rsp81 movq %rcx, 32(%rsp)82 movq 32(%rsp), %rax83 movq %rax, %rdx # This would otherwise be: movq __guard_dispatch_icall_fptr(%rip), %rdx84 xorl %ecx, %ecx85 callq *%rdx86 nop87 addq $40, %rsp88 retq89 # -- End function90 .def main; .scl 2; .type 32; .endef91 .globl main # -- Begin function main92 .p2align 4, 0x9093main: # @main94# %bb.0:95 subq $56, %rsp96 movq __imp_exportfn1(%rip), %rax97 movq %rdx, 48(%rsp)98 movl %ecx, 44(%rsp)99 movq %rax, %rcx100 callq IndirectCall101 xorl %eax, %eax102 addq $56, %rsp103 retq104 # -- End function105 .section .gfids$y,"dr"106 .section .giats$y,"dr"107 .symidx __imp_exportfn1108 .section .gljmp$y,"dr"109 110# Load configuration directory entry (winnt.h _IMAGE_LOAD_CONFIG_DIRECTORY64).111# The linker will define the __guard_* symbols.112 .section .rdata,"dr"113.globl _load_config_used114_load_config_used:115 .long 256116 .fill 124, 1, 0117 .quad __guard_fids_table118 .quad __guard_fids_count119 .long __guard_flags120 .fill 12, 1, 0121 .quad __guard_iat_table122 .quad __guard_iat_count123 .quad __guard_longjmp_table124 .quad __guard_fids_count125 .fill 84, 1, 0126