Index: lld/trunk/COFF/Driver.cpp =================================================================== --- lld/trunk/COFF/Driver.cpp +++ lld/trunk/COFF/Driver.cpp @@ -1236,6 +1236,9 @@ // Write the result. writeResult(); + if (ErrorCount) + return; + // Call exit to avoid calling destructors. exit(0); } Index: lld/trunk/COFF/Writer.cpp =================================================================== --- lld/trunk/COFF/Writer.cpp +++ lld/trunk/COFF/Writer.cpp @@ -187,6 +187,8 @@ C->setRVA(Off); C->OutputSectionOff = Off; Off += C->getSize(); + if (Off > UINT32_MAX) + error("section larger than 4 GiB: " + Name); Header.VirtualSize = Off; if (C->hasData()) Header.SizeOfRawData = alignTo(Off, SectorSize); Index: lld/trunk/test/COFF/section-size.s =================================================================== --- lld/trunk/test/COFF/section-size.s +++ lld/trunk/test/COFF/section-size.s @@ -0,0 +1,14 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc %s -o %tmain.obj +# RUN: echo '.lcomm s, 0x80000000' | llvm-mc -filetype=obj -triple=x86_64-windows-msvc -o %t1.obj +# RUN: cp %t1.obj %t2.obj +# RUN: echo '.lcomm s, 0xffffffff' | llvm-mc -filetype=obj -triple=x86_64-windows-msvc -o %t3.obj + +# Run: lld-link -entry:main %tmain.obj %t3.obj -out:%t.exe + +# RUN: not lld-link -entry:main %tmain.obj %t1.obj %t2.obj -out:%t.exe 2>&1 | FileCheck %s +# CHECK: error: section larger than 4 GiB: .bss + +.globl main +main: + retq