[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
This commit is contained in:
parent
d3bb80a1bc
commit
4aa7f8a30f
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue