blob: 041b328dec9ca79c5b825d525eefec0db919e653 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# RUN: yaml2obj %p/Inputs/export.yaml -o %t.obj
#
# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1 /export:exportfn2
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK1 %s
CHECK1: Export Table:
CHECK1-NEXT: DLL name: export.test.tmp.dll
CHECK1-NEXT: Ordinal base: 1
CHECK1-NEXT: Ordinal RVA Name
CHECK1-NEXT: 1 0x1008 exportfn1
CHECK1-NEXT: 2 0x1010 exportfn2
# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1,@5 /export:exportfn2
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK2 %s
CHECK2: Export Table:
CHECK2-NEXT: DLL name: export.test.tmp.dll
CHECK2-NEXT: Ordinal base: 5
CHECK2-NEXT: Ordinal RVA Name
CHECK2-NEXT: 5 0x1008 exportfn1
CHECK2-NEXT: 6 0x1010 exportfn2
CHECK2-NEXT: 7 0x1010 exportfn3
# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1,@5,noname /export:exportfn2
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK3 %s
CHECK3: Export Table:
CHECK3-NEXT: DLL name: export.test.tmp.dll
CHECK3-NEXT: Ordinal base: 5
CHECK3-NEXT: Ordinal RVA Name
CHECK3-NEXT: 5 0x1008
CHECK3-NEXT: 6 0x1010 exportfn2
# RUN: lld-link /out:%t.dll /dll %t.obj /export:f1=exportfn1 /export:f2=exportfn2 /implib:%t.lib
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK4 %s
# RUN: llvm-nm %t.lib | FileCheck -check-prefix=CHECK4-NM %s
CHECK4: Export Table:
CHECK4-NEXT: DLL name: export.test.tmp.dll
CHECK4-NEXT: Ordinal base: 1
CHECK4-NEXT: Ordinal RVA Name
CHECK4-NEXT: 1 0x1010 exportfn3
CHECK4-NEXT: 2 0x1008 f1
CHECK4-NEXT: 3 0x1010 f2
CHECK4-NM: 00000000 T f1
CHECK4-NM: 00000000 T f2
# RUN: echo "EXPORTS exportfn1 @3" > %t.def
# RUN: echo "fn2=exportfn2 @2" >> %t.def
# RUN: lld-link /out:%t.dll /dll %t.obj /def:%t.def
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK5 %s
CHECK5: Export Table:
CHECK5-NEXT: DLL name: export.test.tmp.dll
CHECK5-NEXT: Ordinal base: 2
CHECK5-NEXT: Ordinal RVA Name
CHECK5-NEXT: 2 0x1010 fn2
CHECK5-NEXT: 3 0x1008 exportfn1
CHECK5-NEXT: 4 0x1010 exportfn3
# RUN: lld-link /out:%t.DLL /dll %t.obj /export:exportfn1 /export:exportfn2 \
# RUN: /export:exportfn1 /export:exportfn2,@5 >& %t.log
# RUN: FileCheck -check-prefix=CHECK6 %s < %t.log
CHECK6: duplicate /export option: exportfn2
CHECK6-NOT: duplicate /export option: exportfn1
# RUN: llvm-nm -M %t.lib | FileCheck --check-prefix=SYMTAB %s
SYMTAB: __imp_exportfn1 in export.test.tmp.DLL
SYMTAB: __imp_exportfn2 in export.test.tmp.DLL
SYMTAB: __imp_exportfn3 in export.test.tmp.DLL
SYMTAB: exportfn1 in export.test.tmp.DLL
SYMTAB: exportfn2 in export.test.tmp.DLL
SYMTAB: exportfn3 in export.test.tmp.DLL
# RUN: lld-link /out:%t.dll /dll %t.obj /export:foo=kernel32.foobar
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=FORWARDER %s
# RUN: llvm-nm -M %t.lib | FileCheck --check-prefix=SYMTAB-FWD %s
# RUN: echo "EXPORTS foo=kernel32.foobar" > %t.def
# RUN: lld-link /out:%t-def.dll /dll %t.obj /def:%t.def
# RUN: llvm-objdump -p %t-def.dll | FileCheck --check-prefix=FORWARDER %s
# RUN: llvm-nm -M %t-def.lib | FileCheck --check-prefix=SYMTAB-FWD %s
FORWARDER: Export Table:
FORWARDER: DLL name: export.test.tmp
FORWARDER: Ordinal base: 1
FORWARDER: Ordinal RVA Name
FORWARDER: 1 0x1010 exportfn
FORWARDER: 2 foo (forwarded to kernel32.foobar)
SYMTAB-FWD: __imp_exportfn3 in export.test.tmp
SYMTAB-FWD-NEXT: __imp_foo in export.test.tmp
SYMTAB-FWD-NEXT: exportfn3 in export.test.tmp
SYMTAB-FWD-NEXT: foo in export.test.tmp
# RUN: lld-link /out:%t-fwd-priv.dll /dll %t.obj /export:foo=kernel32.foobar,DATA,PRIVATE
# RUN: llvm-objdump -p %t-fwd-priv.dll | FileCheck --check-prefix=FORWARDER %s
# RUN: llvm-nm -M %t-fwd-priv.lib | FileCheck --check-prefix=SYMTAB-FWD-PRIV %s
SYMTAB-FWD-PRIV: __imp_exportfn3 in export.test.tmp-fwd-priv
SYMTAB-FWD-PRIV-NOT: __imp_foo
SYMTAB-FWD-PRIV-NEXT: exportfn3 in export.test.tmp-fwd-priv
SYMTAB-FWD-PRIV-NOT: foo
# RUN: echo "EXPORTS foo=kernel32.foobar DATA PRIVATE" > %t-fwd-priv.def
# RUN: lld-link /out:%t-fwd-priv-def.dll /dll %t.obj /def:%t-fwd-priv.def
# RUN: llvm-objdump -p %t-fwd-priv-def.dll | FileCheck --check-prefix=FORWARDER %s
# RUN: llvm-nm -M %t-fwd-priv-def.lib | FileCheck --check-prefix=SYMTAB-FWD-PRIV %s
# RUN: lld-link /out:%t-fwd-ord.dll /dll %t.obj /export:foo=kernel32.foobar,@3,NONAME
# RUN: llvm-objdump -p %t-fwd-ord.dll | FileCheck --check-prefix=FORWARDER-ORD %s
# RUN: llvm-nm -M %t-fwd-ord.lib | FileCheck --check-prefix=SYMTAB-FWD %s
FORWARDER-ORD: Export Table:
FORWARDER-ORD-NEXT: DLL name: export.test.tmp-fwd-ord
FORWARDER-ORD-NEXT: Ordinal base: 3
FORWARDER-ORD-NEXT: Ordinal RVA Name
FORWARDER-ORD-NEXT: 3 (forwarded to kernel32.foobar)
FORWARDER-ORD-NEXT: 4 0x1010 exportfn3
# RUN: echo "EXPORTS foo=kernel32.foobar @3 NONAME" > %t-fwd-ord.def
# RUN: lld-link /out:%t-fwd-ord-def.dll /dll %t.obj /def:%t-fwd-ord.def
# RUN: llvm-objdump -p %t-fwd-ord-def.dll | FileCheck --check-prefix=FORWARDER-ORD %s
# RUN: llvm-nm -M %t-fwd-ord-def.lib | FileCheck --check-prefix=SYMTAB-FWD %s
# RUN: lld-link /out:%t.dll /dll %t.obj /merge:.rdata=.text /export:exportfn1 /export:exportfn2
# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=MERGE --match-full-lines %s
MERGE: DLL name: export.test.tmp.dll
MERGE: Ordinal RVA Name
MERGE-NEXT: 1 0x1008 exportfn1
MERGE-NEXT: 2 0x1010 exportfn2
|