diff options
Diffstat (limited to 'test/COFF/gfids-relocations64.s')
-rw-r--r-- | test/COFF/gfids-relocations64.s | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/test/COFF/gfids-relocations64.s b/test/COFF/gfids-relocations64.s new file mode 100644 index 000000000000..ae2e687222d5 --- /dev/null +++ b/test/COFF/gfids-relocations64.s @@ -0,0 +1,76 @@ +# REQUIRES: x86 +# RUN: llvm-mc -triple x86_64-pc-win32 %s -filetype=obj -o %t.obj +# RUN: lld-link %t.obj -guard:cf -out:%t.exe -entry:main +# RUN: llvm-readobj -coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK + +# f, g, and main go in the table. +# Including g isn't strictly necessary since it's not an indirect call target, +# however the linker can't know that because relative relocations are used both +# for direct calls and for getting the absolute address of a function. +# (use /lldmap:map.txt to check their addresses). +# +# CHECK: GuardFidTable [ +# CHECK-NEXT: 0x140001000 +# CHECK-NEXT: 0x140001010 +# CHECK-NEXT: 0x140001030 +# CHECK-NEXT: ] + + .def f; + .scl 3; + .type 32; + .endef + .section .text,"xr",one_only,f + .p2align 4 +f: movl $1, %eax + ret + + + .def g; + .scl 3; + .type 32; + .endef + .section .text,"xr",one_only,g + .p2align 4 +g: movl $2, %eax + ret + + + .def label; + .scl 6; # StorageClass: Label + .type 0; # Type: Not a function. + .endef + .section .text,"xr",one_only,label + .p2align 4 +label: ret + + + .data + .globl fp + .p2align 4 +fp: .quad f # DIR32 relocation to function + .quad label # DIR32 relocation to label + + + .def main; + .scl 2; + .type 32; + .endef + .section .text,"xr",one_only,main + .globl main + .p2align 4 +main: call *fp # DIR32 relocation to data + call g # REL32 relocation to function + ret + + +# Load configuration directory entry (winnt.h _IMAGE_LOAD_CONFIG_DIRECTORY64). +# The linker will define the __guard_* symbols. + .section .rdata,"dr" +.globl _load_config_used +_load_config_used: + .long 256 + .fill 124, 1, 0 + .quad __guard_fids_table + .quad __guard_fids_count + .long __guard_flags + .fill 128, 1, 0 |