diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1179,6 +1179,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; @@ -1225,6 +1229,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 @@ -15,6 +15,15 @@ # 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 +# CHECK-NEXT: Value: +# 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 +33,15 @@ # 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 +# CHECK-NEXT: Value: +# CHECK-NEXT: Section: .rdata (2) +# CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) # CHECK-NEXT: StorageClass: External (0x2) # CHECK-NEXT: AuxSymbolCount: 0