diff --git a/src/Compilers/Core/Portable/PEWriter/PeWriter.cs b/src/Compilers/Core/Portable/PEWriter/PeWriter.cs index 73f3116278c40077b1177deac5c5c22ee498ef66..bbc954b1cea953cf7bcc33cbc311af7fe64365b8 100644 --- a/src/Compilers/Core/Portable/PEWriter/PeWriter.cs +++ b/src/Compilers/Core/Portable/PEWriter/PeWriter.cs @@ -43,19 +43,11 @@ internal sealed class PeWriter private NtHeader _ntHeader; private CoffHeader _coffHeader; - private readonly BlobWriter _rdataWriter = new BlobWriter(); - private readonly BlobWriter _sdataWriter = new BlobWriter(); - private readonly BlobWriter _tlsDataWriter = new BlobWriter(); private readonly BlobWriter _win32ResourceWriter = new BlobWriter(1024); - private readonly BlobWriter _coverageDataWriter = new BlobWriter(); - private SectionHeader _coverSection; private SectionHeader _relocSection; private SectionHeader _resourceSection; - private SectionHeader _rdataSection; - private SectionHeader _sdataSection; private SectionHeader _textSection; - private SectionHeader _tlsSection; private PeWriter( ModulePropertiesForSerialization properties, @@ -198,10 +190,6 @@ private bool WritePeToStream(MetadataWriter mdWriter, Func getPeStream, nativePdbContentId, out metadataPosition); - WriteRdataSection(peStream); - WriteSdataSection(peStream); - WriteCoverSection(peStream); - WriteTlsSection(peStream); WriteResourceSection(peStream); WriteRelocSection(peStream); @@ -320,10 +308,6 @@ private short GetSectionCount() { short sectionCount = 1; // .text if (_properties.RequiresStartupStub) sectionCount++; //.reloc - if (_tlsDataWriter.Length > 0) sectionCount++; //.tls - if (_rdataWriter.Length > 0) sectionCount++; //.rdata - if (_sdataWriter.Length > 0) sectionCount++; //.sdata - if (_coverageDataWriter.Length > 0) sectionCount++; //.cover if (!IteratorHelper.EnumerableIsEmpty(_nativeResourcesOpt) || _nativeResourceSectionOpt != null) sectionCount++; //.rsrc; return sectionCount; @@ -407,7 +391,7 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre ntHeader.MinorLinkerVersion = _properties.LinkerMinorVersion; ntHeader.AddressOfEntryPoint = _properties.RequiresStartupStub ? mappedFieldDataStreamRva - (_is32bit ? 6 : 10) : 0; // TODO: constants ntHeader.BaseOfCode = textSectionRva; - ntHeader.BaseOfData = _rdataSection.RelativeVirtualAddress; + ntHeader.BaseOfData = _resourceSection.RelativeVirtualAddress; // TODO: first section containing initialized data? ntHeader.ImageBase = _properties.BaseAddress; ntHeader.FileAlignment = _properties.FileAlignment; ntHeader.MajorSubsystemVersion = _properties.MajorSubsystemVersion; @@ -422,8 +406,13 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre ntHeader.SizeOfHeapCommit = _properties.SizeOfHeapCommit; ntHeader.SizeOfCode = _textSection.SizeOfRawData; - ntHeader.SizeOfInitializedData = _rdataSection.SizeOfRawData + _coverSection.SizeOfRawData + _sdataSection.SizeOfRawData + _tlsSection.SizeOfRawData + _resourceSection.SizeOfRawData + _relocSection.SizeOfRawData; + + // TODO: total size of all sections containing initialized data + ntHeader.SizeOfInitializedData = _resourceSection.SizeOfRawData + _relocSection.SizeOfRawData; + ntHeader.SizeOfHeaders = BitArithmeticUtilities.Align(ComputeSizeOfPeHeaders(), _properties.FileAlignment); + + // TODO: last section: ntHeader.SizeOfImage = BitArithmeticUtilities.Align(_relocSection.RelativeVirtualAddress + _relocSection.VirtualSize, 0x2000); ntHeader.SizeOfUninitializedData = 0; @@ -460,13 +449,6 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre _resourceSection.RelativeVirtualAddress, _resourceSection.VirtualSize); } - - if (_tlsSection.SizeOfRawData > 0) - { - ntHeader.ThreadLocalStorageTable = new DirectoryEntry( - _tlsSection.RelativeVirtualAddress, - _tlsSection.SizeOfRawData); - } } private void FillInTextSectionHeader(MetadataSizes metadataSizes) @@ -495,67 +477,7 @@ private void FillInTextSectionHeader(MetadataSizes metadataSizes) private void FillInSectionHeaders() { - _rdataSection = new SectionHeader( - characteristics: SectionCharacteristics.MemRead | - SectionCharacteristics.ContainsInitializedData, - name: ".rdata", - numberOfLinenumbers: 0, - numberOfRelocations: 0, - pointerToLinenumbers: 0, - pointerToRawData: _textSection.PointerToRawData + _textSection.SizeOfRawData, - pointerToRelocations: 0, - relativeVirtualAddress: BitArithmeticUtilities.Align(_textSection.RelativeVirtualAddress + _textSection.VirtualSize, 0x2000), - sizeOfRawData: BitArithmeticUtilities.Align(_rdataWriter.Length, _properties.FileAlignment), - virtualSize: _rdataWriter.Length - ); - - _sdataSection = new SectionHeader( - characteristics: SectionCharacteristics.MemRead | - SectionCharacteristics.MemWrite | - SectionCharacteristics.ContainsInitializedData, - name: ".sdata", - numberOfLinenumbers: 0, - numberOfRelocations: 0, - pointerToLinenumbers: 0, - pointerToRawData: _rdataSection.PointerToRawData + _rdataSection.SizeOfRawData, - pointerToRelocations: 0, - relativeVirtualAddress: BitArithmeticUtilities.Align(_rdataSection.RelativeVirtualAddress + _rdataSection.VirtualSize, 0x2000), - sizeOfRawData: BitArithmeticUtilities.Align(_sdataWriter.Length, _properties.FileAlignment), - virtualSize: _sdataWriter.Length - ); - - _coverSection = new SectionHeader( - characteristics: SectionCharacteristics.MemRead | - SectionCharacteristics.MemWrite | - SectionCharacteristics.MemNotPaged | - SectionCharacteristics.ContainsInitializedData, - name: ".cover", - numberOfLinenumbers: 0, - numberOfRelocations: 0, - pointerToLinenumbers: 0, - pointerToRawData: _sdataSection.PointerToRawData + _sdataSection.SizeOfRawData, - pointerToRelocations: 0, - relativeVirtualAddress: BitArithmeticUtilities.Align(_sdataSection.RelativeVirtualAddress + _sdataSection.VirtualSize, 0x2000), - sizeOfRawData: BitArithmeticUtilities.Align(_coverageDataWriter.Length, _properties.FileAlignment), - virtualSize: _coverageDataWriter.Length - ); - - _tlsSection = new SectionHeader( - characteristics: SectionCharacteristics.MemRead | - SectionCharacteristics.MemWrite | - SectionCharacteristics.ContainsInitializedData, - name: ".tls", - numberOfLinenumbers: 0, - numberOfRelocations: 0, - pointerToLinenumbers: 0, - pointerToRawData: _coverSection.PointerToRawData + _coverSection.SizeOfRawData, - pointerToRelocations: 0, - relativeVirtualAddress: BitArithmeticUtilities.Align(_coverSection.RelativeVirtualAddress + _coverSection.VirtualSize, 0x2000), - sizeOfRawData: BitArithmeticUtilities.Align(_tlsDataWriter.Length, _properties.FileAlignment), - virtualSize: _tlsDataWriter.Length - ); - - int resourcesRva = BitArithmeticUtilities.Align(_tlsSection.RelativeVirtualAddress + _tlsSection.VirtualSize, 0x2000); + int resourcesRva = BitArithmeticUtilities.Align(_textSection.RelativeVirtualAddress + _textSection.VirtualSize, 0x2000); int sizeOfWin32Resources = this.ComputeSizeOfWin32Resources(resourcesRva); _resourceSection = new SectionHeader( @@ -565,7 +487,7 @@ private void FillInSectionHeaders() numberOfLinenumbers: 0, numberOfRelocations: 0, pointerToLinenumbers: 0, - pointerToRawData: _tlsSection.PointerToRawData + _tlsSection.SizeOfRawData, + pointerToRawData: _textSection.PointerToRawData + _textSection.SizeOfRawData, pointerToRelocations: 0, relativeVirtualAddress: resourcesRva, sizeOfRawData: BitArithmeticUtilities.Align(sizeOfWin32Resources, _properties.FileAlignment), @@ -1125,12 +1047,8 @@ private void WriteHeaders(Stream peStream, out long ntHeaderTimestampPosition) // Section Headers WriteSectionHeader(_textSection, writer); - WriteSectionHeader(_rdataSection, writer); - WriteSectionHeader(_sdataSection, writer); - WriteSectionHeader(_coverSection, writer); WriteSectionHeader(_resourceSection, writer); WriteSectionHeader(_relocSection, writer); - WriteSectionHeader(_tlsSection, writer); writer.WriteTo(peStream); _headerWriter = _emptyStream; @@ -1436,24 +1354,6 @@ private void WriteRuntimeStartupStub(Stream peStream) writer.WriteTo(peStream); } - private void WriteCoverSection(Stream peStream) - { - peStream.Position = _coverSection.PointerToRawData; - _coverageDataWriter.WriteTo(peStream); - } - - private void WriteRdataSection(Stream peStream) - { - peStream.Position = _rdataSection.PointerToRawData; - _rdataWriter.WriteTo(peStream); - } - - private void WriteSdataSection(Stream peStream) - { - peStream.Position = _sdataSection.PointerToRawData; - _sdataWriter.WriteTo(peStream); - } - private void WriteRelocSection(Stream peStream) { if (!_properties.RequiresStartupStub) @@ -1500,11 +1400,5 @@ private void WriteResourceSection(Stream peStream) peStream.WriteByte(0); } } - - private void WriteTlsSection(Stream peStream) - { - peStream.Position = _tlsSection.PointerToRawData; - _tlsDataWriter.WriteTo(peStream); - } } }