From: Shoaib Meenai Date: Tue, 19 Sep 2017 23:58:05 +0000 (+0000) Subject: [COFF] Check for sections larger than 4 GiB X-Git-Tag: llvmorg-6.0.0-rc1~7662 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4aa7f8a30f1bba5dc7e6ad45ffa03325ef3fca2a;p=platform%2Fupstream%2Fllvm.git [COFF] Check for sections larger than 4 GiB Sections are limited to 4 GiB. Error out early if a section exceeds this size, rather than overflowing the section size and getting confusing assertion failures/segfaults later. Differential Revision: https://reviews.llvm.org/D38005 llvm-svn: 313699 --- diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 6785111a..dccf790 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1236,6 +1236,9 @@ void LinkerDriver::link(ArrayRef ArgsArr) { // Write the result. writeResult(); + if (ErrorCount) + return; + // Call exit to avoid calling destructors. exit(0); } diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 66e4818..db446d0 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -187,6 +187,8 @@ void OutputSection::addChunk(Chunk *C) { 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); diff --git a/lld/test/COFF/section-size.s b/lld/test/COFF/section-size.s new file mode 100644 index 0000000..28f3f4a --- /dev/null +++ b/lld/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