Index: llvm/lib/Object/WindowsResource.cpp =================================================================== --- llvm/lib/Object/WindowsResource.cpp +++ llvm/lib/Object/WindowsResource.cpp @@ -30,6 +30,10 @@ const uint32_t MIN_HEADER_SIZE = 7 * sizeof(uint32_t) + 2 * sizeof(uint16_t); +// COFF files seem to be inconsistent with alignment between sections, just use +// 8-byte because it makes everyone happy. +const uint32_t SECTION_ALIGNMENT = sizeof(uint64_t); + static const size_t ResourceMagicSize = 16; static const size_t NullEntrySize = 16; @@ -321,9 +325,11 @@ uint64_t FileSize; uint32_t SymbolTableOffset; uint32_t SectionOneSize; + uint32_t SectionOnePadding; uint32_t SectionOneOffset; uint32_t SectionOneRelocations; uint32_t SectionTwoSize; + uint32_t SectionTwoPadding; uint32_t SectionTwoOffset; const ArrayRef> StringTable; std::vector StringTableOffsets; @@ -386,6 +392,8 @@ FileSize += SectionOneSize; FileSize += Data.size() * llvm::COFF::RelocationSize; // one relocation for each resource. + SectionOnePadding = OffsetToAlignment(FileSize, SECTION_ALIGNMENT); + FileSize += SectionOnePadding; } void WindowsResourceCOFFWriter::performSectionTwoLayout() { @@ -398,6 +406,8 @@ SectionTwoSize += llvm::alignTo(Entry.size(), sizeof(uint64_t)); } FileSize += SectionTwoSize; + SectionTwoPadding = OffsetToAlignment(FileSize, SECTION_ALIGNMENT); + FileSize += SectionTwoPadding; } static std::time_t getTime() { @@ -497,6 +507,8 @@ writeDirectoryTree(); writeDirectoryStringTable(); writeFirstSectionRelocations(); + + Current += SectionOnePadding; } void WindowsResourceCOFFWriter::writeSecondSection() { @@ -505,6 +517,8 @@ std::copy(RawDataEntry.begin(), RawDataEntry.end(), Current); Current += alignTo(RawDataEntry.size(), sizeof(uint64_t)); } + + Current += SectionTwoPadding; } void WindowsResourceCOFFWriter::writeSymbolTable() {