Index: COFF/Writer.cpp =================================================================== --- COFF/Writer.cpp +++ COFF/Writer.cpp @@ -500,8 +500,8 @@ createExportTable(); mergeSections(); readRelocTargets(); - finalizeAddresses(); removeEmptySections(); + finalizeAddresses(); setSectionPermissions(); createSymbolAndStringTable(); @@ -885,7 +885,12 @@ // The Windows loader doesn't seem to like empty sections, // so we remove them if any. void Writer::removeEmptySections() { - auto IsEmpty = [](OutputSection *S) { return S->getVirtualSize() == 0; }; + auto IsEmpty = [](OutputSection *S) { + for (Chunk *C : S->Chunks) + if (C->getSize() > 0) + return false; + return true; + }; OutputSections.erase( std::remove_if(OutputSections.begin(), OutputSections.end(), IsEmpty), OutputSections.end()); Index: test/COFF/header-size.s =================================================================== --- /dev/null +++ test/COFF/header-size.s @@ -0,0 +1,12 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-windows %s -o %t.obj +// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe +// RUN: llvm-readobj -sections %t.exe | FileCheck %s + .globl main +main: + ret + +// Check that the first section data comes at 512 bytes in the file. +// If the size allocated for headers would include size for section +// headers which aren't written, PointerToRawData would be 0x400 instead. +// CHECK: PointerToRawData: 0x200