diff options
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 19 | ||||
-rw-r--r-- | lld/test/pecoff/alignment.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/associative.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/base-reloc.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/bss-section.test | 4 | ||||
-rw-r--r-- | lld/test/pecoff/hello.test | 6 | ||||
-rw-r--r-- | lld/test/pecoff/merge-largest.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/merge-same-size.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/nonstandard-sections.test | 8 | ||||
-rw-r--r-- | lld/test/pecoff/pe32plus.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/section-renaming.test | 6 | ||||
-rw-r--r-- | lld/test/pecoff/trivial.test | 4 |
12 files changed, 33 insertions, 26 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index 22dd2f01ca9..07642dbc510 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -75,6 +75,7 @@ public: virtual ~Chunk() {} virtual void write(uint8_t *buffer) = 0; virtual uint64_t size() const { return _size; } + virtual uint64_t onDiskSize() const { return size(); } virtual uint64_t align() const { return 1; } uint64_t fileOffset() const { return _fileOffset; } @@ -175,6 +176,12 @@ private: class SectionChunk : public Chunk { public: + uint64_t onDiskSize() const override { + if (_characteristics & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) + return 0; + return llvm::RoundUpToAlignment(size(), SECTOR_SIZE); + } + uint64_t align() const override { return SECTOR_SIZE; } uint32_t getCharacteristics() const { return _characteristics; } StringRef getSectionName() const { return _sectionName; } @@ -730,19 +737,18 @@ SectionHeaderTableChunk::createSectionHeader(SectionChunk *chunk) { std::min(sizeof(header.Name), sectionName.size())); uint32_t characteristics = chunk->getCharacteristics(); + header.VirtualSize = chunk->size(); header.VirtualAddress = chunk->getVirtualAddress(); + header.SizeOfRawData = chunk->onDiskSize(); header.PointerToRelocations = 0; header.PointerToLinenumbers = 0; header.NumberOfRelocations = 0; header.NumberOfLinenumbers = 0; - header.SizeOfRawData = chunk->size(); header.Characteristics = characteristics; if (characteristics & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) { - header.VirtualSize = 0; header.PointerToRawData = 0; } else { - header.VirtualSize = chunk->size(); header.PointerToRawData = chunk->fileOffset(); } return header; @@ -1018,7 +1024,8 @@ std::error_code PECOFFWriter::writeFile(const File &linkedFile, this->build<llvm::object::pe32_header>(linkedFile); } - uint64_t totalSize = _chunks.back()->fileOffset() + _chunks.back()->size(); + uint64_t totalSize = + _chunks.back()->fileOffset() + _chunks.back()->onDiskSize(); std::unique_ptr<llvm::FileOutputBuffer> buffer; std::error_code ec = llvm::FileOutputBuffer::create( path, totalSize, buffer, llvm::FileOutputBuffer::F_executable); @@ -1144,7 +1151,7 @@ void PECOFFWriter::setImageSizeOnDisk() { _imageSizeOnDisk = llvm::RoundUpToAlignment(_imageSizeOnDisk, chunk->align()); chunk->setFileOffset(_imageSizeOnDisk); - _imageSizeOnDisk += chunk->size(); + _imageSizeOnDisk += chunk->onDiskSize(); } } @@ -1154,7 +1161,7 @@ uint64_t PECOFFWriter::calcSectionSize( for (auto &cp : _chunks) if (SectionChunk *chunk = dyn_cast<SectionChunk>(&*cp)) if (chunk->getCharacteristics() & sectionType) - ret += chunk->size(); + ret += chunk->onDiskSize(); return ret; } diff --git a/lld/test/pecoff/alignment.test b/lld/test/pecoff/alignment.test index f3d8d0661f0..78f1c97a8ca 100644 --- a/lld/test/pecoff/alignment.test +++ b/lld/test/pecoff/alignment.test @@ -5,7 +5,7 @@ # RUN: llvm-readobj -sections %t.exe | FileCheck %s CHECK: Name: .bss (2E 62 73 73 00 00 00 00) -CHECK: RawDataSize: 18 +CHECK: RawDataSize: 0 CHECK: Name: .data (2E 64 61 74 61 00 00 00) CHECK-NEXT: VirtualSize: 0x6 diff --git a/lld/test/pecoff/associative.test b/lld/test/pecoff/associative.test index f998befd007..6c4eaf0f7f1 100644 --- a/lld/test/pecoff/associative.test +++ b/lld/test/pecoff/associative.test @@ -7,4 +7,4 @@ # RUN: obj2yaml %t.exe | FileCheck %s CHECK: - Name: .CRT -CHECK: SectionData: '77777777' +CHECK: SectionData: '777777770000 diff --git a/lld/test/pecoff/base-reloc.test b/lld/test/pecoff/base-reloc.test index 15c3a0226b1..8b2246f9125 100644 --- a/lld/test/pecoff/base-reloc.test +++ b/lld/test/pecoff/base-reloc.test @@ -38,7 +38,7 @@ BASEREL-HEADER: BaseRelocationTableSize: 0xC BASEREL-HEADER: Name: .reloc (2E 72 65 6C 6F 63 00 00) BASEREL-HEADER-NEXT: VirtualSize: 0xC BASEREL-HEADER-NEXT: VirtualAddress: 0x3000 -BASEREL-HEADER-NEXT: RawDataSize: 12 +BASEREL-HEADER-NEXT: RawDataSize: 512 BASEREL-HEADER-NEXT: PointerToRawData: 0x600 BASEREL-HEADER-NEXT: PointerToRelocations: 0x0 BASEREL-HEADER-NEXT: PointerToLineNumbers: 0x0 diff --git a/lld/test/pecoff/bss-section.test b/lld/test/pecoff/bss-section.test index d45baab176e..4181e994fbf 100644 --- a/lld/test/pecoff/bss-section.test +++ b/lld/test/pecoff/bss-section.test @@ -5,9 +5,9 @@ CHECK: Section { CHECK: Number: 1 CHECK-NEXT: Name: .bss -CHECK-NEXT: VirtualSize: 0x0 +CHECK-NEXT: VirtualSize: 0x320 CHECK-NEXT: VirtualAddress: 0x1000 -CHECK-NEXT: RawDataSize: 800 +CHECK-NEXT: RawDataSize: 0 CHECK-NEXT: PointerToRawData: 0x0 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 diff --git a/lld/test/pecoff/hello.test b/lld/test/pecoff/hello.test index 3760fd554d7..679b8b3ad98 100644 --- a/lld/test/pecoff/hello.test +++ b/lld/test/pecoff/hello.test @@ -4,7 +4,7 @@ # RUN: llvm-readobj -file-headers %t1.exe | FileCheck -check-prefix=FILE %s FILE: ImageOptionalHeader { -FILE: SizeOfInitializedData: 30 +FILE: SizeOfInitializedData: 1024 FILE: SizeOfHeaders: 512 FILE: } @@ -20,7 +20,7 @@ SECTIONS-NEXT: Number: 1 SECTIONS-NEXT: Name: .data SECTIONS-NEXT: VirtualSize: 0x12 SECTIONS-NEXT: VirtualAddress: 0x1000 -SECTIONS-NEXT: RawDataSize: 18 +SECTIONS-NEXT: RawDataSize: 512 SECTIONS-NEXT: PointerToRawData: 0x200 SECTIONS-NEXT: PointerToRelocations: 0x0 SECTIONS-NEXT: PointerToLineNumbers: 0x0 @@ -37,7 +37,7 @@ SECTIONS-NEXT: Number: 2 SECTIONS-NEXT: Name: .text (2E 74 65 78 74 00 00 00) SECTIONS-NEXT: VirtualSize: 0x1C SECTIONS-NEXT: VirtualAddress: 0x2000 -SECTIONS-NEXT: RawDataSize: 28 +SECTIONS-NEXT: RawDataSize: 512 SECTIONS-NEXT: PointerToRawData: 0x400 SECTIONS-NEXT: PointerToRelocations: 0x0 SECTIONS-NEXT: PointerToLineNumbers: 0x0 diff --git a/lld/test/pecoff/merge-largest.test b/lld/test/pecoff/merge-largest.test index 73d2d940660..c3ee96ca9c5 100644 --- a/lld/test/pecoff/merge-largest.test +++ b/lld/test/pecoff/merge-largest.test @@ -21,4 +21,4 @@ READOBJ-NEXT: Number: 1 READOBJ-NEXT: Name: .text (2E 74 65 78 74 00 00 00) READOBJ-NEXT: VirtualSize: 0x8 READOBJ-NEXT: VirtualAddress: 0x1000 -READOBJ-NEXT: RawDataSize: 8 +READOBJ-NEXT: RawDataSize: 512 diff --git a/lld/test/pecoff/merge-same-size.test b/lld/test/pecoff/merge-same-size.test index a7c8c9f4596..c2918a2bc1a 100644 --- a/lld/test/pecoff/merge-same-size.test +++ b/lld/test/pecoff/merge-same-size.test @@ -29,4 +29,4 @@ READOBJ-NEXT: Number: 1 READOBJ-NEXT: Name: .text (2E 74 65 78 74 00 00 00) READOBJ-NEXT: VirtualSize: 0x7 READOBJ-NEXT: VirtualAddress: 0x1000 -READOBJ-NEXT: RawDataSize: 7 +READOBJ-NEXT: RawDataSize: 512 diff --git a/lld/test/pecoff/nonstandard-sections.test b/lld/test/pecoff/nonstandard-sections.test index 27c5fb38ba6..2ca18162923 100644 --- a/lld/test/pecoff/nonstandard-sections.test +++ b/lld/test/pecoff/nonstandard-sections.test @@ -10,7 +10,7 @@ CHECK-NEXT: Number: 1 CHECK-NEXT: Name: .bar (2E 62 61 72 00 00 00 00) CHECK-NEXT: VirtualSize: 0x4 CHECK-NEXT: VirtualAddress: 0x1000 -CHECK-NEXT: RawDataSize: 4 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0x400 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 @@ -26,7 +26,7 @@ CHECK-NEXT: Number: 2 CHECK-NEXT: Name: .data (2E 64 61 74 61 00 00 00) CHECK-NEXT: VirtualSize: 0x4 CHECK-NEXT: VirtualAddress: 0x2000 -CHECK-NEXT: RawDataSize: 4 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0x600 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 @@ -43,7 +43,7 @@ CHECK-NEXT: Number: 3 CHECK-NEXT: Name: .foo (2E 66 6F 6F 00 00 00 00) CHECK-NEXT: VirtualSize: 0x4 CHECK-NEXT: VirtualAddress: 0x3000 -CHECK-NEXT: RawDataSize: 4 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0x800 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 @@ -60,7 +60,7 @@ CHECK-NEXT: Number: 4 CHECK-NEXT: Name: .text (2E 74 65 78 74 00 00 00) CHECK-NEXT: VirtualSize: 0x4 CHECK-NEXT: VirtualAddress: 0x4000 -CHECK-NEXT: RawDataSize: 4 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0xA00 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 diff --git a/lld/test/pecoff/pe32plus.test b/lld/test/pecoff/pe32plus.test index fcd14aa3293..652e647ed75 100644 --- a/lld/test/pecoff/pe32plus.test +++ b/lld/test/pecoff/pe32plus.test @@ -22,7 +22,7 @@ CHECK-NEXT: } CHECK-NEXT: ImageOptionalHeader { CHECK-NEXT: MajorLinkerVersion: 0 CHECK-NEXT: MinorLinkerVersion: 0 -CHECK-NEXT: SizeOfCode: 1 +CHECK-NEXT: SizeOfCode: 512 CHECK-NEXT: SizeOfInitializedData: 0 CHECK-NEXT: SizeOfUninitializedData: 0 CHECK-NEXT: AddressOfEntryPoint: 0x1000 diff --git a/lld/test/pecoff/section-renaming.test b/lld/test/pecoff/section-renaming.test index 6b84a0d9fea..d4fc154693a 100644 --- a/lld/test/pecoff/section-renaming.test +++ b/lld/test/pecoff/section-renaming.test @@ -12,7 +12,7 @@ CHECK-NEXT: Number: 1 CHECK-NEXT: Name: .data (2E 64 61 74 61 00 00 00) CHECK-NEXT: VirtualSize: 0x4 CHECK-NEXT: VirtualAddress: 0x1000 -CHECK-NEXT: RawDataSize: 4 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0x200 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 @@ -29,7 +29,7 @@ CHECK-NEXT: Number: 2 CHECK-NEXT: Name: .hoge (2E 68 6F 67 65 00 00 00) CHECK-NEXT: VirtualSize: 0x4 CHECK-NEXT: VirtualAddress: 0x2000 -CHECK-NEXT: RawDataSize: 4 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0x400 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 @@ -46,7 +46,7 @@ CHECK-NEXT: Number: 3 CHECK-NEXT: Name: .text (2E 74 65 78 74 00 00 00) CHECK-NEXT: VirtualSize: 0x8 CHECK-NEXT: VirtualAddress: 0x3000 -CHECK-NEXT: RawDataSize: 8 +CHECK-NEXT: RawDataSize: 512 CHECK-NEXT: PointerToRawData: 0x600 CHECK-NEXT: PointerToRelocations: 0x0 CHECK-NEXT: PointerToLineNumbers: 0x0 diff --git a/lld/test/pecoff/trivial.test b/lld/test/pecoff/trivial.test index 6f149d0b21b..b9e3bcbd2c1 100644 --- a/lld/test/pecoff/trivial.test +++ b/lld/test/pecoff/trivial.test @@ -30,7 +30,7 @@ FILE-NEXT: } FILE-NEXT: ImageOptionalHeader { FILE-NEXT: MajorLinkerVersion: 0 FILE-NEXT: MinorLinkerVersion: 0 -FILE-NEXT: SizeOfCode: 6 +FILE-NEXT: SizeOfCode: 512 FILE-NEXT: SizeOfInitializedData: 0 FILE-NEXT: SizeOfUninitializedData: 0 FILE-NEXT: AddressOfEntryPoint: 0x1000 @@ -69,7 +69,7 @@ SECTIONS-NEXT: Number: 1 SECTIONS-NEXT: Name: .text (2E 74 65 78 74 00 00 00) SECTIONS-NEXT: VirtualSize: 0x6 SECTIONS-NEXT: VirtualAddress: 0x1000 -SECTIONS-NEXT: RawDataSize: 6 +SECTIONS-NEXT: RawDataSize: 512 SECTIONS-NEXT: PointerToRawData: 0x200 SECTIONS-NEXT: PointerToRelocations: 0x0 SECTIONS-NEXT: PointerToLineNumbers: 0x0 |