From 4aa7f8a30f1bba5dc7e6ad45ffa03325ef3fca2a Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Tue, 19 Sep 2017 23:58:05 +0000 Subject: [PATCH] [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 --- lld/COFF/Driver.cpp | 3 +++ lld/COFF/Writer.cpp | 2 ++ lld/test/COFF/section-size.s | 14 ++++++++++++++ 3 files changed, 19 insertions(+) create mode 100644 lld/test/COFF/section-size.s diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 6785111acd31..dccf7901ca4a 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 66e4818650e2..db446d083eac 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 000000000000..28f3f4acbc9d --- /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