1# REQUIRES: x86 2# RUN: llvm-mc -triple x86_64-pc-win32 %s -filetype=obj -o %t.obj 3# RUN: lld-link %t.obj -guard:cf -out:%t.exe -entry:main 4# RUN: llvm-readobj --coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK 5 6# f, g, and main go in the table. 7# Including g isn't strictly necessary since it's not an indirect call target, 8# however the linker can't know that because relative relocations are used both 9# for direct calls and for getting the absolute address of a function. 10# (use /lldmap:map.txt to check their addresses). 11# 12# CHECK: GuardFidTable [ 13# CHECK-NEXT: 0x140001000 14# CHECK-NEXT: 0x140001010 15# CHECK-NEXT: 0x140001030 16# CHECK-NEXT: ] 17 18 .def f; 19 .scl 3; 20 .type 32; 21 .endef 22 .section .text,"xr",one_only,f 23 .p2align 4 24f: movl $1, %eax 25 ret 26 27 28 .def g; 29 .scl 3; 30 .type 32; 31 .endef 32 .section .text,"xr",one_only,g 33 .p2align 4 34g: movl $2, %eax 35 ret 36 37 38 .def label; 39 .scl 6; # StorageClass: Label 40 .type 0; # Type: Not a function. 41 .endef 42 .section .text,"xr",one_only,label 43 .p2align 4 44label: ret 45 46 47 .data 48 .globl fp 49 .p2align 4 50fp: .quad f # DIR32 relocation to function 51 .quad label # DIR32 relocation to label 52 53 54 .def main; 55 .scl 2; 56 .type 32; 57 .endef 58 .section .text,"xr",one_only,main 59 .globl main 60 .p2align 4 61main: call *fp # DIR32 relocation to data 62 call g # REL32 relocation to function 63 ret 64 65 66# Load configuration directory entry (winnt.h _IMAGE_LOAD_CONFIG_DIRECTORY64). 67# The linker will define the __guard_* symbols. 68 .section .rdata,"dr" 69.globl _load_config_used 70_load_config_used: 71 .long 256 72 .fill 124, 1, 0 73 .quad __guard_fids_table 74 .quad __guard_fids_count 75 .long __guard_flags 76 .fill 128, 1, 0 77