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