| # 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: DLL name: export.test.tmp.dll |
| CHECK1: Ordinal RVA Name |
| CHECK1-NEXT: 0 0 |
| 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: DLL name: export.test.tmp.dll |
| CHECK2: Ordinal RVA Name |
| CHECK2-NEXT: 0 0 |
| CHECK2-NEXT: 1 0 |
| CHECK2-NEXT: 2 0 |
| CHECK2-NEXT: 3 0 |
| CHECK2-NEXT: 4 0 |
| 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: DLL name: export.test.tmp.dll |
| CHECK3: Ordinal RVA Name |
| CHECK3-NEXT: 0 0 |
| CHECK3-NEXT: 1 0 |
| CHECK3-NEXT: 2 0 |
| CHECK3-NEXT: 3 0 |
| CHECK3-NEXT: 4 0 |
| 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: DLL name: export.test.tmp.dll |
| CHECK4: Ordinal RVA Name |
| CHECK4-NEXT: 0 0 |
| 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: DLL name: export.test.tmp.dll |
| CHECK5: Ordinal RVA Name |
| CHECK5-NEXT: 0 0 |
| CHECK5-NEXT: 1 0 |
| 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: exportfn1 in export.test.tmp.DLL |
| SYMTAB: __imp_exportfn2 in export.test.tmp.DLL |
| SYMTAB: exportfn2 in export.test.tmp.DLL |
| SYMTAB: __imp_exportfn3 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: echo "EXPORTS foo=kernel32.foobar" > %t.def |
| # RUN: lld-link /out:%t.dll /dll %t.obj /def:%t.def |
| # RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=FORWARDER %s |
| |
| FORWARDER: Export Table: |
| FORWARDER: DLL name: export.test.tmp.dll |
| FORWARDER: Ordinal base: 0 |
| FORWARDER: Ordinal RVA Name |
| FORWARDER: 0 0 |
| FORWARDER: 1 0x1010 exportfn |
| FORWARDER: 2 foo (forwarded to kernel32.foobar) |
| |
| # 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: 0 0 |
| MERGE-NEXT: 1 0x1008 exportfn1 |
| MERGE-NEXT: 2 0x1010 exportfn2 |