diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1183,6 +1183,10 @@ COFFSymbolRef ref = d->getCOFFSymbol(); sym.Type = ref.getType(); sym.StorageClass = ref.getStorageClass(); + } else if (def->kind() == Symbol::DefinedImportThunkKind) { + sym.Type = (IMAGE_SYM_DTYPE_FUNCTION << SCT_COMPLEX_TYPE_SHIFT) | + IMAGE_SYM_TYPE_NULL; + sym.StorageClass = IMAGE_SYM_CLASS_EXTERNAL; } else { sym.Type = IMAGE_SYM_TYPE_NULL; sym.StorageClass = IMAGE_SYM_CLASS_EXTERNAL; @@ -1229,6 +1233,14 @@ if (Optional sym = createSymbol(d)) outputSymtab.push_back(*sym); + + if (auto *dthunk = dyn_cast(d)) { + if (!dthunk->wrappedSym->writtenToSymtab) { + dthunk->wrappedSym->writtenToSymtab = true; + if (Optional sym = createSymbol(dthunk->wrappedSym)) + outputSymtab.push_back(*sym); + } + } } } } diff --git a/lld/test/COFF/symtab.test b/lld/test/COFF/symtab.test --- a/lld/test/COFF/symtab.test +++ b/lld/test/COFF/symtab.test @@ -1,10 +1,10 @@ # RUN: yaml2obj %s -o %t.obj # RUN: lld-link /debug:dwarf /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib -# RUN: llvm-readobj --symbols %t.exe | FileCheck %s +# RUN: llvm-readobj --symbols %t.exe | FileCheck --check-prefixes=CHECK,DWARF %s # RUN: lld-link /debug:dwarf /opt:noref /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib -# RUN: llvm-readobj --symbols %t.exe | FileCheck %s +# RUN: llvm-readobj --symbols %t.exe | FileCheck --check-prefixes=CHECK,DWARF %s # RUN: lld-link /debug:symtab /opt:noref /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib -# RUN: llvm-readobj --symbols %t.exe | FileCheck %s +# RUN: llvm-readobj --symbols %t.exe | FileCheck --check-prefixes=CHECK,NODWF %s # RUN: lld-link /debug /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib # RUN: llvm-readobj --symbols %t.exe | FileCheck -check-prefix=NO %s @@ -15,6 +15,16 @@ # CHECK-NEXT: Value: 80 # CHECK-NEXT: Section: .text (1) # CHECK-NEXT: BaseType: Null (0x0) +# CHECK-NEXT: ComplexType: Function (0x2) +# CHECK-NEXT: StorageClass: External (0x2) +# CHECK-NEXT: AuxSymbolCount: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __imp_MessageBoxA +# DWARF-NEXT: Value: 128 +# NODWF-NEXT: Value: 72 +# CHECK-NEXT: Section: .rdata (2) +# CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) # CHECK-NEXT: StorageClass: External (0x2) # CHECK-NEXT: AuxSymbolCount: 0 @@ -24,6 +34,16 @@ # CHECK-NEXT: Value: 64 # CHECK-NEXT: Section: .text (1) # CHECK-NEXT: BaseType: Null (0x0) +# CHECK-NEXT: ComplexType: Function (0x2) +# CHECK-NEXT: StorageClass: External (0x2) +# CHECK-NEXT: AuxSymbolCount: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __imp_ExitProcess +# DWARF-NEXT: Value: 120 +# NODWF-NEXT: Value: 64 +# CHECK-NEXT: Section: .rdata (2) +# CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) # CHECK-NEXT: StorageClass: External (0x2) # CHECK-NEXT: AuxSymbolCount: 0