@@ -71,6 +71,11 @@ StringRef COFFImportFile::getExportName() const {
7171 name = ltrim1 (name, " ?@_" );
7272 name = name.substr (0 , name.find (' @' ));
7373 break ;
74+ case IMPORT_NAME_EXPORTAS: {
75+ StringRef dllName = StringRef (name.begin () + name.size () + 1 );
76+ name = StringRef (dllName.begin () + dllName.size () + 1 );
77+ break ;
78+ }
7479 default :
7580 break ;
7681 }
@@ -209,6 +214,7 @@ class ObjectFactory {
209214 // Library Format.
210215 NewArchiveMember createShortImport (StringRef Sym, uint16_t Ordinal,
211216 ImportType Type, ImportNameType NameType,
217+ StringRef ExportName,
212218 MachineTypes Machine);
213219
214220 // Create a weak external file which is described in PE/COFF Aux Format 3.
@@ -500,12 +506,13 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
500506 return {MemoryBufferRef{F, ImportName}};
501507}
502508
503- NewArchiveMember ObjectFactory::createShortImport (StringRef Sym,
504- uint16_t Ordinal,
505- ImportType ImportType,
506- ImportNameType NameType,
507- MachineTypes Machine) {
509+ NewArchiveMember
510+ ObjectFactory::createShortImport (StringRef Sym, uint16_t Ordinal,
511+ ImportType ImportType, ImportNameType NameType,
512+ StringRef ExportName, MachineTypes Machine) {
508513 size_t ImpSize = ImportName.size () + Sym.size () + 2 ; // +2 for NULs
514+ if (!ExportName.empty ())
515+ ImpSize += ExportName.size () + 1 ;
509516 size_t Size = sizeof (coff_import_header) + ImpSize;
510517 char *Buf = Alloc.Allocate <char >(Size);
511518 memset (Buf, 0 , Size);
@@ -525,6 +532,10 @@ NewArchiveMember ObjectFactory::createShortImport(StringRef Sym,
525532 memcpy (P, Sym.data (), Sym.size ());
526533 P += Sym.size () + 1 ;
527534 memcpy (P, ImportName.data (), ImportName.size ());
535+ if (!ExportName.empty ()) {
536+ P += ImportName.size () + 1 ;
537+ memcpy (P, ExportName.data (), ExportName.size ());
538+ }
528539
529540 return {MemoryBufferRef (StringRef (Buf, Size), ImportName)};
530541}
@@ -641,27 +652,39 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
641652 ImportType = IMPORT_CONST;
642653
643654 StringRef SymbolName = E.SymbolName .empty () ? E.Name : E.SymbolName ;
644- ImportNameType NameType = E.Noname
645- ? IMPORT_ORDINAL
646- : getNameType (SymbolName, E.Name ,
647- Machine, MinGW);
648- Expected<std::string> Name = E.ExtName .empty ()
649- ? std::string (SymbolName)
650- : replace (SymbolName, E.Name , E.ExtName );
651-
652- if (!Name)
653- return Name.takeError ();
654-
655- if (!E.AliasTarget .empty () && *Name != E.AliasTarget ) {
655+ std::string Name;
656+
657+ if (E.ExtName .empty ()) {
658+ Name = std::string (SymbolName);
659+ } else {
660+ Expected<std::string> ReplacedName =
661+ replace (SymbolName, E.Name , E.ExtName );
662+ if (!ReplacedName)
663+ return ReplacedName.takeError ();
664+ Name.swap (*ReplacedName);
665+ }
666+
667+ if (!E.AliasTarget .empty () && Name != E.AliasTarget ) {
656668 Members.push_back (
657- OF.createWeakExternal (E.AliasTarget , * Name, false , Machine));
669+ OF.createWeakExternal (E.AliasTarget , Name, false , Machine));
658670 Members.push_back (
659- OF.createWeakExternal (E.AliasTarget , * Name, true , Machine));
671+ OF.createWeakExternal (E.AliasTarget , Name, true , Machine));
660672 continue ;
661673 }
662674
663- Members.push_back (
664- OF.createShortImport (*Name, E.Ordinal , ImportType, NameType, Machine));
675+ ImportNameType NameType;
676+ std::string ExportName;
677+ if (E.Noname ) {
678+ NameType = IMPORT_ORDINAL;
679+ } else if (!E.ExportAs .empty ()) {
680+ NameType = IMPORT_NAME_EXPORTAS;
681+ ExportName = E.ExportAs ;
682+ } else {
683+ NameType = getNameType (SymbolName, E.Name , Machine, MinGW);
684+ }
685+
686+ Members.push_back (OF.createShortImport (Name, E.Ordinal , ImportType,
687+ NameType, ExportName, Machine));
665688 }
666689
667690 return writeArchive (Path, Members, SymtabWritingMode::NormalSymtab,
0 commit comments