Files
clang-p2996/lld/test/COFF/export.test
Alvin Wong e2e132c5d9 [LLD][COFF] Set OrdinalBase to 1 for export table
Before this, LLD sets OrdinalBase to 0, which deviates from usual
practices. This technically would allow LLD to export a symbol using
ordinal 0, however LLD never use export ordinal 0, which results in
binaries with export tables always having an empty export at ordinal 0.

This change makes LLD set OrdinalBase to 1 and not create the empty
export with ordinal 0, which makes its behaviour more in line with both
the MSVC linker and the GNU linker.

Reviewed By: mstorsjo

Differential Revision: https://reviews.llvm.org/D134140
2022-10-03 10:58:44 +03:00

102 lines
3.7 KiB
Plaintext

# 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: 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: 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: 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: 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: 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: 1
FORWARDER: Ordinal RVA Name
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: 1 0x1008 exportfn1
MERGE-NEXT: 2 0x1010 exportfn2