From 1c79ce9a4cc0aad8e95d018db56b380f7920886c Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 8 Jul 2015 20:22:50 +0000 Subject: [PATCH] COFF: Implement dllimported symbol name mangling. Symbols exported by DLLs are listed in import library files. Exported names may be mangled by "Import Name Type" field as described in PE/COFF spec 7.3. This patch implements that mangling scheme. llvm-svn: 241719 --- lld/COFF/InputFiles.cpp | 27 ++++++---- lld/test/COFF/Inputs/imports-mangle.lib | Bin 0 -> 2108 bytes lld/test/COFF/imports-mangle.test | 66 ++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 lld/test/COFF/Inputs/imports-mangle.lib create mode 100644 lld/test/COFF/imports-mangle.test diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index ac12e1e0e7ab..a0211623f62d 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -20,12 +20,9 @@ #include "llvm/Support/raw_ostream.h" #include +using namespace llvm::COFF; using namespace llvm::object; using namespace llvm::support::endian; -using llvm::COFF::ImportHeader; -using llvm::COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE; -using llvm::COFF::IMAGE_FILE_MACHINE_AMD64; -using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN; using llvm::RoundUpToAlignment; using llvm::sys::fs::identify_magic; using llvm::sys::fs::file_magic; @@ -260,11 +257,23 @@ std::error_code ImportFile::parse() { StringRef Name = StringAlloc.save(StringRef(Buf + sizeof(*Hdr))); StringRef ImpName = StringAlloc.save(Twine("__imp_") + Name); StringRef DLLName(Buf + sizeof(coff_import_header) + Name.size() + 1); - StringRef ExternalName = Name; - if (Hdr->getNameType() == llvm::COFF::IMPORT_ORDINAL) - ExternalName = ""; - auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, ExternalName, - Hdr); + StringRef ExtName; + switch (Hdr->getNameType()) { + case IMPORT_ORDINAL: + ExtName = ""; + break; + case IMPORT_NAME: + ExtName = Name; + break; + case IMPORT_NAME_NOPREFIX: + ExtName = Name.ltrim("?@_"); + break; + case IMPORT_NAME_UNDECORATE: + ExtName = Name.ltrim("?@_"); + ExtName = ExtName.substr(0, ExtName.find('@')); + break; + } + auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, ExtName, Hdr); SymbolBodies.push_back(ImpSym); // If type is function, we need to create a thunk which jump to an diff --git a/lld/test/COFF/Inputs/imports-mangle.lib b/lld/test/COFF/Inputs/imports-mangle.lib new file mode 100644 index 0000000000000000000000000000000000000000..af6e583a31b953d1c9451266b09bee50093b8d54 GIT binary patch literal 2108 zcmb_d&2JJ>5dX1!Db|LlF)`5wn@hpnzkM|G&UYM z`7e0zkMPE!S8sYU9@>AzL!H_8-m)OpZqrTX&6^Kq-uu0o;qIg6PHW>y;$dp^%bG^c zDC9Dk{HQ)7MLna--C6>`6+oK-A_XA23B(U19TR7o6%-o)v4L%umsXZ*b$j8(>hoH8 zrM_IV*SlTVcC}Hd{B6VsvI<+h)Tl1n3&nboyxW~^d$-rg!d*OBXIYnab}%5;r?fXM z>s7H-vR+I3s4g%H*&zyXf?-Aj3K3v43LKE)m}r)05OX0y93g15#t=bNu3?OxAuu}P z;^RRW99vv|2$T;aVIv0@K7BIAgnQcA+VWueUsafSRW54@rys`8kDnXi5O9gG;VEigrVzjtk^-P-BycGve(_iGPQm2!1a+D8~W^C6h1?A=|G zR(f~R$qcYs-Oe_haldzjlM}x;xlti7sjFImd&~``aW5ruNFS4Z=tuB;=7$>A-{wVr z937aK5;F}iX$@Rn6Pqs)v@&!v=gkYJuep`+)jbp+ZE|He!sM;K$}p6YE8~k2B %t.obj +# RUN: lld -flavor link2 /out:%t.exe /opt:noref /entry:main \ +# RUN: %t.obj %p/Inputs/imports-mangle.lib +# RUN: llvm-readobj -coff-imports %t.exe | FileCheck %s + +# CHECK: Import { +# CHECK: Symbol: sym4 (0) +# CHECK: Symbol: sym3 (1) +# CHECK: Symbol: sym1 (2) +# CHECK: Symbol: (2) +# CHECK: } + +--- +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 000000000000 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 6 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + Selection: IMAGE_COMDAT_SELECT_ANY + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: sym1 + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: sym2 + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: _sym3 + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: '?sym4@@YAHH@Z' + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +...