提交 16975929 编写于 作者: T Tomáš Matoušek

Merge pull request #3855 from tmat/PEWriterCleanup3

Remove unused PE sections
...@@ -43,19 +43,11 @@ internal sealed class PeWriter ...@@ -43,19 +43,11 @@ internal sealed class PeWriter
private NtHeader _ntHeader; private NtHeader _ntHeader;
private CoffHeader _coffHeader; 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 _win32ResourceWriter = new BlobWriter(1024);
private readonly BlobWriter _coverageDataWriter = new BlobWriter();
private SectionHeader _coverSection;
private SectionHeader _relocSection; private SectionHeader _relocSection;
private SectionHeader _resourceSection; private SectionHeader _resourceSection;
private SectionHeader _rdataSection;
private SectionHeader _sdataSection;
private SectionHeader _textSection; private SectionHeader _textSection;
private SectionHeader _tlsSection;
private PeWriter( private PeWriter(
ModulePropertiesForSerialization properties, ModulePropertiesForSerialization properties,
...@@ -198,10 +190,6 @@ private bool WritePeToStream(MetadataWriter mdWriter, Func<Stream> getPeStream, ...@@ -198,10 +190,6 @@ private bool WritePeToStream(MetadataWriter mdWriter, Func<Stream> getPeStream,
nativePdbContentId, nativePdbContentId,
out metadataPosition); out metadataPosition);
WriteRdataSection(peStream);
WriteSdataSection(peStream);
WriteCoverSection(peStream);
WriteTlsSection(peStream);
WriteResourceSection(peStream); WriteResourceSection(peStream);
WriteRelocSection(peStream); WriteRelocSection(peStream);
...@@ -320,10 +308,6 @@ private short GetSectionCount() ...@@ -320,10 +308,6 @@ private short GetSectionCount()
{ {
short sectionCount = 1; // .text short sectionCount = 1; // .text
if (_properties.RequiresStartupStub) sectionCount++; //.reloc 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; if (!IteratorHelper.EnumerableIsEmpty(_nativeResourcesOpt) || _nativeResourceSectionOpt != null) sectionCount++; //.rsrc;
return sectionCount; return sectionCount;
...@@ -407,7 +391,7 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre ...@@ -407,7 +391,7 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre
ntHeader.MinorLinkerVersion = _properties.LinkerMinorVersion; ntHeader.MinorLinkerVersion = _properties.LinkerMinorVersion;
ntHeader.AddressOfEntryPoint = _properties.RequiresStartupStub ? mappedFieldDataStreamRva - (_is32bit ? 6 : 10) : 0; // TODO: constants ntHeader.AddressOfEntryPoint = _properties.RequiresStartupStub ? mappedFieldDataStreamRva - (_is32bit ? 6 : 10) : 0; // TODO: constants
ntHeader.BaseOfCode = textSectionRva; ntHeader.BaseOfCode = textSectionRva;
ntHeader.BaseOfData = _rdataSection.RelativeVirtualAddress; ntHeader.BaseOfData = _resourceSection.RelativeVirtualAddress; // TODO: first section containing initialized data?
ntHeader.ImageBase = _properties.BaseAddress; ntHeader.ImageBase = _properties.BaseAddress;
ntHeader.FileAlignment = _properties.FileAlignment; ntHeader.FileAlignment = _properties.FileAlignment;
ntHeader.MajorSubsystemVersion = _properties.MajorSubsystemVersion; ntHeader.MajorSubsystemVersion = _properties.MajorSubsystemVersion;
...@@ -422,8 +406,13 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre ...@@ -422,8 +406,13 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre
ntHeader.SizeOfHeapCommit = _properties.SizeOfHeapCommit; ntHeader.SizeOfHeapCommit = _properties.SizeOfHeapCommit;
ntHeader.SizeOfCode = _textSection.SizeOfRawData; 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); ntHeader.SizeOfHeaders = BitArithmeticUtilities.Align(ComputeSizeOfPeHeaders(), _properties.FileAlignment);
// TODO: last section:
ntHeader.SizeOfImage = BitArithmeticUtilities.Align(_relocSection.RelativeVirtualAddress + _relocSection.VirtualSize, 0x2000); ntHeader.SizeOfImage = BitArithmeticUtilities.Align(_relocSection.RelativeVirtualAddress + _relocSection.VirtualSize, 0x2000);
ntHeader.SizeOfUninitializedData = 0; ntHeader.SizeOfUninitializedData = 0;
...@@ -460,13 +449,6 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre ...@@ -460,13 +449,6 @@ private void FillInNtHeader(MetadataSizes metadataSizes, int mappedFieldDataStre
_resourceSection.RelativeVirtualAddress, _resourceSection.RelativeVirtualAddress,
_resourceSection.VirtualSize); _resourceSection.VirtualSize);
} }
if (_tlsSection.SizeOfRawData > 0)
{
ntHeader.ThreadLocalStorageTable = new DirectoryEntry(
_tlsSection.RelativeVirtualAddress,
_tlsSection.SizeOfRawData);
}
} }
private void FillInTextSectionHeader(MetadataSizes metadataSizes) private void FillInTextSectionHeader(MetadataSizes metadataSizes)
...@@ -495,67 +477,7 @@ private void FillInTextSectionHeader(MetadataSizes metadataSizes) ...@@ -495,67 +477,7 @@ private void FillInTextSectionHeader(MetadataSizes metadataSizes)
private void FillInSectionHeaders() private void FillInSectionHeaders()
{ {
_rdataSection = new SectionHeader( int resourcesRva = BitArithmeticUtilities.Align(_textSection.RelativeVirtualAddress + _textSection.VirtualSize, 0x2000);
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 sizeOfWin32Resources = this.ComputeSizeOfWin32Resources(resourcesRva); int sizeOfWin32Resources = this.ComputeSizeOfWin32Resources(resourcesRva);
_resourceSection = new SectionHeader( _resourceSection = new SectionHeader(
...@@ -565,7 +487,7 @@ private void FillInSectionHeaders() ...@@ -565,7 +487,7 @@ private void FillInSectionHeaders()
numberOfLinenumbers: 0, numberOfLinenumbers: 0,
numberOfRelocations: 0, numberOfRelocations: 0,
pointerToLinenumbers: 0, pointerToLinenumbers: 0,
pointerToRawData: _tlsSection.PointerToRawData + _tlsSection.SizeOfRawData, pointerToRawData: _textSection.PointerToRawData + _textSection.SizeOfRawData,
pointerToRelocations: 0, pointerToRelocations: 0,
relativeVirtualAddress: resourcesRva, relativeVirtualAddress: resourcesRva,
sizeOfRawData: BitArithmeticUtilities.Align(sizeOfWin32Resources, _properties.FileAlignment), sizeOfRawData: BitArithmeticUtilities.Align(sizeOfWin32Resources, _properties.FileAlignment),
...@@ -1125,12 +1047,8 @@ private void WriteHeaders(Stream peStream, out long ntHeaderTimestampPosition) ...@@ -1125,12 +1047,8 @@ private void WriteHeaders(Stream peStream, out long ntHeaderTimestampPosition)
// Section Headers // Section Headers
WriteSectionHeader(_textSection, writer); WriteSectionHeader(_textSection, writer);
WriteSectionHeader(_rdataSection, writer);
WriteSectionHeader(_sdataSection, writer);
WriteSectionHeader(_coverSection, writer);
WriteSectionHeader(_resourceSection, writer); WriteSectionHeader(_resourceSection, writer);
WriteSectionHeader(_relocSection, writer); WriteSectionHeader(_relocSection, writer);
WriteSectionHeader(_tlsSection, writer);
writer.WriteTo(peStream); writer.WriteTo(peStream);
_headerWriter = _emptyStream; _headerWriter = _emptyStream;
...@@ -1436,24 +1354,6 @@ private void WriteRuntimeStartupStub(Stream peStream) ...@@ -1436,24 +1354,6 @@ private void WriteRuntimeStartupStub(Stream peStream)
writer.WriteTo(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) private void WriteRelocSection(Stream peStream)
{ {
if (!_properties.RequiresStartupStub) if (!_properties.RequiresStartupStub)
...@@ -1500,11 +1400,5 @@ private void WriteResourceSection(Stream peStream) ...@@ -1500,11 +1400,5 @@ private void WriteResourceSection(Stream peStream)
peStream.WriteByte(0); peStream.WriteByte(0);
} }
} }
private void WriteTlsSection(Stream peStream)
{
peStream.Position = _tlsSection.PointerToRawData;
_tlsDataWriter.WriteTo(peStream);
}
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册