IMAGE_SCN_MEM_WRITE = 0x80000000
IMAGE_SCN_MEM_DISCARDABLE = 0x2000000
IMAGE_SCN_LNK_NRELOC_OVFL = 0x1000000
+ IMAGE_SCN_ALIGN_4BYTES = 0x300000
+ IMAGE_SCN_ALIGN_8BYTES = 0x400000
IMAGE_SCN_ALIGN_32BYTES = 0x600000
)
// However, the entire Go runtime is initialized from just one function, so it is unlikely
// that this will need to grow in the future.
var size int
+ var alignment uint32
switch objabi.GOARCH {
default:
Exitf("peFile.addInitArray: unsupported GOARCH=%q\n", objabi.GOARCH)
- case "386":
- size = 4
- case "amd64":
- size = 8
- case "arm":
+ case "386", "arm":
size = 4
- case "arm64":
+ alignment = IMAGE_SCN_ALIGN_4BYTES
+ case "amd64", "arm64":
size = 8
+ alignment = IMAGE_SCN_ALIGN_8BYTES
}
sect := f.addSection(".ctors", size, size)
- sect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
+ sect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | alignment
sect.sizeOfRawData = uint32(size)
ctxt.Out.SeekSet(int64(sect.pointerToRawData))
sect.checkOffset(ctxt.Out.Offset())