From be68a99f20ea2e6fb38e46b3675d3615a789bdfd Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 5 Dec 2014 21:52:02 +0000 Subject: [PATCH] [PECOFF] Fix exported symbols in an import library. Looks like if you have symbol foo in a module-definition file (.def file), and if the actual symbol name to match that export description is _foo@x (where x is an integer), the exported symbol name becomes this. - foo in the .dll file - foo@x in the .lib file I have checked in a few fixes recently for exported symbol name mangling. I haven't found a simple rule that governs all the mangling rules. There may not ever exist. For now, this is a patch to improve .lib file compatibility. llvm-svn: 223524 --- lld/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp | 2 ++ lld/test/pecoff/Inputs/exports2.def | 6 ++++++ lld/test/pecoff/exportlib2.test | 12 ++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 lld/test/pecoff/Inputs/exports2.def diff --git a/lld/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp b/lld/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp index d6081c1..fd3360f 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp @@ -35,6 +35,8 @@ createModuleDefinitionFile(const PECOFFLinkingContext &ctx) { os << " "; if (!desc.externalName.empty()) { os << desc.externalName; + } else if (!desc.mangledName.empty()) { + os << ctx.undecorateSymbol(desc.mangledName); } else { os << ctx.undecorateSymbol(desc.name); } diff --git a/lld/test/pecoff/Inputs/exports2.def b/lld/test/pecoff/Inputs/exports2.def new file mode 100644 index 0000000..1c95f42 --- /dev/null +++ b/lld/test/pecoff/Inputs/exports2.def @@ -0,0 +1,6 @@ +; This is a comment line + +EXPORTS + exportfn1 @5 ; foo + exportfn7 + exportfn5=exportfn6 PRIVATE diff --git a/lld/test/pecoff/exportlib2.test b/lld/test/pecoff/exportlib2.test index b2b070b..e846b0b 100644 --- a/lld/test/pecoff/exportlib2.test +++ b/lld/test/pecoff/exportlib2.test @@ -1,8 +1,8 @@ # RUN: yaml2obj %p/Inputs/export.obj.yaml > %t.obj # # RUN: lld -flavor link /out:%t.dll /dll /entry:init \ -# RUN: /export:exportfn1 /export:exportfn2 /lldmoduledeffile:%t.def -- %t.obj -# RUN: FileCheck -check-prefix=CHECK1 %s < %t.def +# RUN: /export:exportfn1 /export:exportfn2 /lldmoduledeffile:%t1.def -- %t.obj +# RUN: FileCheck -check-prefix=CHECK1 %s < %t1.def CHECK1: LIBRARY "exportlib2.test.tmp.dll" CHECK1: EXPORTS @@ -11,11 +11,11 @@ CHECK1: exportfn2 @2 CHECK1: exportfn3@256 @3 # RUN: lld -flavor link /out:%t.dll /dll /entry:init \ -# RUN: /def:%p/Inputs/exports.def /lldmoduledeffile:%t.def -- %t.obj -# RUN: FileCheck -check-prefix=CHECK2 %s < %t.def +# RUN: /def:%p/Inputs/exports2.def /lldmoduledeffile:%t2.def -- %t.obj +# RUN: FileCheck -check-prefix=CHECK2 %s < %t2.def CHECK2: LIBRARY "exportlib2.test.tmp.dll" CHECK2: EXPORTS CHECK2: exportfn1 @5 -CHECK2: exportfn2 @6 -CHECK2: exportfn3@256 @7 +CHECK2: exportfn3@256 @6 +CHECK2: exportfn7@8 @7 -- 2.7.4