# 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