summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2013-07-01 07:32:12 +0000
committerRui Ueyama <ruiu@google.com>2013-07-01 07:32:12 +0000
commitda513290dec5166fb4604094c552f2bae8365be7 (patch)
tree315e2c459ce2293aede416ecb910e655a6beab9c /lld
parent8ebfad76bc1498835e1c91340a49556e76813347 (diff)
downloadbcm5719-llvm-da513290dec5166fb4604094c552f2bae8365be7.tar.gz
bcm5719-llvm-da513290dec5166fb4604094c552f2bae8365be7.zip
[PECOFF][Writer] Do not emit the empty section as Windows loader rejects such executable.
llvm-svn: 185308
Diffstat (limited to 'lld')
-rw-r--r--lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp11
-rw-r--r--lld/test/pecoff/hello.test16
-rw-r--r--lld/test/pecoff/trivial.test35
3 files changed, 11 insertions, 51 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
index 1821c93e0c1..b0b31f0d3c5 100644
--- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
@@ -438,6 +438,11 @@ void SectionHeaderTableChunk::write(uint8_t *fileBuffer) {
uint64_t offset = 0;
fileBuffer += fileOffset();
for (const auto &chunk : _sections) {
+ // Skip the empty section. Windows loader does not like a section
+ // of size zero and rejects such executable.
+ if (chunk->size() == 0)
+ continue;
+
const llvm::object::coff_section &header = chunk->getSectionHeader();
std::memcpy(fileBuffer + offset, &header, sizeof(header));
offset += sizeof(header);
@@ -525,8 +530,12 @@ private:
uint32_t va = offset;
for (auto &cp : _chunks) {
if (SectionChunk *chunk = dyn_cast<SectionChunk>(&*cp)) {
- numSections++;
chunk->setVirtualAddress(va);
+
+ // Skip the empty section.
+ if (chunk->size() == 0)
+ continue;
+ numSections++;
va = llvm::RoundUpToAlignment(va + chunk->size(), PAGE_SIZE);
}
}
diff --git a/lld/test/pecoff/hello.test b/lld/test/pecoff/hello.test
index 0676950c366..f69d8e245dc 100644
--- a/lld/test/pecoff/hello.test
+++ b/lld/test/pecoff/hello.test
@@ -25,22 +25,6 @@ CHECK: ]
CHECK: }
CHECK: Section {
CHECK: Number: 2
-CHECK: Name: .rdata (2E 72 64 61 74 61 00 00)
-CHECK: VirtualSize: 0x0
-CHECK: VirtualAddress: 0x2000
-CHECK: RawDataSize: 0
-CHECK: PointerToRawData: 0x400
-CHECK: PointerToRelocations: 0x0
-CHECK: PointerToLineNumbers: 0x0
-CHECK: RelocationCount: 0
-CHECK: LineNumberCount: 0
-CHECK: Characteristics [ (0x40000040)
-CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-CHECK: IMAGE_SCN_MEM_READ (0x40000000)
-CHECK: ]
-CHECK: }
-CHECK: Section {
-CHECK: Number: 3
CHECK: Name: .data (2E 64 61 74 61 00 00 00)
CHECK: VirtualSize: 0x18
CHECK: VirtualAddress: 0x2000
diff --git a/lld/test/pecoff/trivial.test b/lld/test/pecoff/trivial.test
index a47dab0340f..2a19db86971 100644
--- a/lld/test/pecoff/trivial.test
+++ b/lld/test/pecoff/trivial.test
@@ -10,7 +10,7 @@ FILE: Arch: i386
FILE: AddressSize: 32bit
FILE: ImageFileHeader {
FILE: Machine: IMAGE_FILE_MACHINE_I386 (0x14C)
-FILE: SectionCount: 3
+FILE: SectionCount: 1
FILE: TimeDateStamp:
FILE: PointerToSymbolTable: 0x0
FILE: SymbolCount: 0
@@ -78,37 +78,4 @@ SECTIONS: IMAGE_SCN_MEM_EXECUTE (0x20000000)
SECTIONS: IMAGE_SCN_MEM_READ (0x40000000)
SECTIONS: ]
SECTIONS: }
-SECTIONS: Section {
-SECTIONS: Number: 2
-SECTIONS: Name: .rdata (2E 72 64 61 74 61 00 00)
-SECTIONS: VirtualSize: 0x0
-SECTIONS: VirtualAddress: 0x2000
-SECTIONS: RawDataSize: 0
-SECTIONS: PointerToRawData: 0x400
-SECTIONS: PointerToRelocations: 0x0
-SECTIONS: PointerToLineNumbers: 0x0
-SECTIONS: RelocationCount: 0
-SECTIONS: LineNumberCount: 0
-SECTIONS: Characteristics [ (0x40000040)
-SECTIONS: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-SECTIONS: IMAGE_SCN_MEM_READ (0x40000000)
-SECTIONS: ]
-SECTIONS: }
-SECTIONS: Section {
-SECTIONS: Number: 3
-SECTIONS: Name: .data (2E 64 61 74 61 00 00 00)
-SECTIONS: VirtualSize: 0x0
-SECTIONS: VirtualAddress: 0x2000
-SECTIONS: RawDataSize: 0
-SECTIONS: PointerToRawData: 0x400
-SECTIONS: PointerToRelocations: 0x0
-SECTIONS: PointerToLineNumbers: 0x0
-SECTIONS: RelocationCount: 0
-SECTIONS: LineNumberCount: 0
-SECTIONS: Characteristics [ (0xC0000040)
-SECTIONS: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-SECTIONS: IMAGE_SCN_MEM_READ (0x40000000)
-SECTIONS: IMAGE_SCN_MEM_WRITE (0x80000000)
-SECTIONS: ]
-SECTIONS: }
SECTIONS: ]
OpenPOWER on IntegriCloud