Index: lld/COFF/Chunks.cpp =================================================================== --- lld/COFF/Chunks.cpp +++ lld/COFF/Chunks.cpp @@ -619,6 +619,7 @@ void StringChunk::writeTo(uint8_t *Buf) const { memcpy(Buf + OutputSectionOff, Str.data(), Str.size()); + Buf[OutputSectionOff + Str.size()] = '\0'; } ImportThunkChunkX64::ImportThunkChunkX64(Defined *S) : ImpSymbol(S) { Index: lld/COFF/DLL.cpp =================================================================== --- lld/COFF/DLL.cpp +++ lld/COFF/DLL.cpp @@ -416,6 +416,8 @@ size_t getSize() const override { return Size * 4; } void writeTo(uint8_t *Buf) const override { + memset(Buf + OutputSectionOff, 0, getSize()); + for (const Export &E : Config->Exports) { uint8_t *P = Buf + OutputSectionOff + E.Ordinal * 4; uint32_t Bit = 0; Index: lld/test/COFF/export.test =================================================================== --- lld/test/COFF/export.test +++ lld/test/COFF/export.test @@ -97,3 +97,12 @@ FORWARDER: 0 0 FORWARDER: 1 0x1010 exportfn FORWARDER: 2 foo (forwarded to kernel32.foobar) + +# RUN: lld-link /out:%t.dll /dll %t.obj /merge:.rdata=.text /export:exportfn1 /export:exportfn2 +# RUN: llvm-objdump -p %t.dll | FileCheck -check-prefix=MERGE -match-full-lines %s + +MERGE: DLL name: export.test.tmp.dll +MERGE: Ordinal RVA Name +MERGE-NEXT: 0 0 +MERGE-NEXT: 1 0x1008 exportfn1 +MERGE-NEXT: 2 0x1010 exportfn2