diff options
author | Rui Ueyama <ruiu@google.com> | 2013-07-01 07:32:12 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2013-07-01 07:32:12 +0000 |
commit | da513290dec5166fb4604094c552f2bae8365be7 (patch) | |
tree | 315e2c459ce2293aede416ecb910e655a6beab9c /lld | |
parent | 8ebfad76bc1498835e1c91340a49556e76813347 (diff) | |
download | bcm5719-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.cpp | 11 | ||||
-rw-r--r-- | lld/test/pecoff/hello.test | 16 | ||||
-rw-r--r-- | lld/test/pecoff/trivial.test | 35 |
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: ] |