2018-08-09 21:43:22 +08:00
|
|
|
# REQUIRES: x86
|
|
|
|
# RUN: llvm-mc -triple i686-pc-win32 %s -filetype=obj -o %t.obj
|
[COFF] Implement /safeseh:no and check @feat.00 flags by default
Summary:
Fixes PR41828. Before this, LLD always emitted SafeSEH chunks and
defined __safe_se_handler_table & size. Now, /safeseh:no leaves those
undefined.
Additionally, we were checking for the safeseh @feat.00 flag in two
places: once to emit errors, and once during safeseh table construction.
The error was set up to be off by default, but safeseh is supposed to be
on by default. I combined the two checks, so now LLD emits an error if
an input object lacks @feat.00 and safeseh is enabled. This caused the
majority of 32-bit LLD tests to fail, since many test input object files
lack @feat.00 symbols. I explicitly added -safeseh:no to those tests to
preserve behavior.
Finally, LLD no longer sets IMAGE_DLL_CHARACTERISTICS_NO_SEH if any
input file wasn't compiled for safeseh.
Reviewers: mstorsjo, ruiu, thakis
Reviewed By: ruiu, thakis
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63570
llvm-svn: 366238
2019-07-17 02:17:33 +08:00
|
|
|
# RUN: lld-link -safeseh:no %t.obj -guard:cf -out:%t.exe -entry:main
|
2019-05-01 13:49:01 +08:00
|
|
|
# RUN: llvm-readobj --coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK
|
2018-08-09 21:43:22 +08:00
|
|
|
|
|
|
|
# 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
|