forked from OSchip/llvm-project
88 lines
2.1 KiB
ArmAsm
88 lines
2.1 KiB
ArmAsm
# REQUIRES: x86
|
|
# RUN: llvm-mc -triple i686-pc-win32 %s -filetype=obj -o %t.obj
|
|
# RUN: lld-link -safeseh:no %t.obj -guard:cf -out:%t.exe -entry:main
|
|
# RUN: llvm-readobj --coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK
|
|
|
|
# Only f and _main should go in the table.
|
|
# (use /lldmap:map.txt to check their addresses).
|
|
#
|
|
# CHECK: GuardFidTable [
|
|
# CHECK-NEXT: 0x401000
|
|
# CHECK-NEXT: 0x401030
|
|
# CHECK-NEXT: ]
|
|
|
|
# The input was loosly based on studying this program:
|
|
#
|
|
# void foo() { return; }
|
|
# void bar() { return; }
|
|
# int main() {
|
|
# foo();
|
|
# void (*arr[])() = { &bar };
|
|
# (*arr[0])();
|
|
# return 0;
|
|
# }
|
|
# cl /c a.cc && dumpbin /disasm a.obj > a.txt &&
|
|
# link a.obj /guard:cf /map:map.txt && dumpbin /loadconfig a.exe
|
|
|
|
|
|
|
|
.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: .long f # DIR32 relocation to function
|
|
.long 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_DIRECTORY32).
|
|
# The linker will define the ___guard_* symbols.
|
|
.section .rdata,"dr"
|
|
.globl __load_config_used
|
|
__load_config_used:
|
|
.long 104 # Size.
|
|
.fill 76, 1, 0
|
|
.long ___guard_fids_table
|
|
.long ___guard_fids_count
|
|
.long ___guard_flags
|
|
.fill 12, 1, 0
|