src/cmd/link/internal/ld/pe.go | 12 ++++++++++++ diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index c9cb25dbe5b8b626180a1218451e2e7c179662e0..5d68ca7d9ca7728eec3e51f84842fcffb4b95464 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -1515,6 +1515,18 @@ Exitf("unknown PE architecture: %v", ctxt.Arch.Family) case sys.AMD64, sys.I386, sys.ARM: } + if rsrcsym != 0 { + // The resource symbol may have been copied to the mmap'd + // output buffer. If so, certain conditions can cause that + // mmap'd output buffer to be munmap'd before we get a chance + // to use it. To avoid any issues we copy the data to the heap + // when the resource symbol exists. + rsrc := ctxt.loader.Syms[rsrcsym] + data := make([]byte, len(rsrc.P)) + copy(data, rsrc.P) + rsrc.P = data + } + t := pefile.addSection(".text", int(Segtext.Length), int(Segtext.Length)) t.characteristics = IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ if ctxt.LinkMode == LinkExternal {