diff options
| author | Shoaib Meenai <smeenai@fb.com> | 2017-09-19 23:58:05 +0000 |
|---|---|---|
| committer | Shoaib Meenai <smeenai@fb.com> | 2017-09-19 23:58:05 +0000 |
| commit | 4aa7f8a30f1bba5dc7e6ad45ffa03325ef3fca2a (patch) | |
| tree | a59d2e345a250646a85e1114cf2287a912dc3a8f | |
| parent | d3bb80a1bc6c5219a6f55b9dd625e7919b21ff82 (diff) | |
| download | bcm5719-llvm-4aa7f8a30f1bba5dc7e6ad45ffa03325ef3fca2a.tar.gz bcm5719-llvm-4aa7f8a30f1bba5dc7e6ad45ffa03325ef3fca2a.zip | |
[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
| -rw-r--r-- | lld/COFF/Driver.cpp | 3 | ||||
| -rw-r--r-- | lld/COFF/Writer.cpp | 2 | ||||
| -rw-r--r-- | lld/test/COFF/section-size.s | 14 |
3 files changed, 19 insertions, 0 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 6785111acd3..dccf7901ca4 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1236,6 +1236,9 @@ void LinkerDriver::link(ArrayRef<const char *> 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 66e4818650e..db446d083ea 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 00000000000..28f3f4acbc9 --- /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 |

