brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · c044210 Raw
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