llvm-project
76 строк · 2.0 Кб
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
25ret
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
35ret
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
62call g # REL32 relocation to function
63ret
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