aboutsummaryrefslogtreecommitdiff
path: root/lld/test/COFF/export.test
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