[lld] r283738 - Recommit r283733 "[ELF] - Do not crash if common symbol alignment set to value greater than UINT32_MAX.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 10 03:31:03 PDT 2016
Author: grimar
Date: Mon Oct 10 05:31:03 2016
New Revision: 283738
URL: http://llvm.org/viewvc/llvm-project?rev=283738&view=rev
Log:
Recommit r283733 "[ELF] - Do not crash if common symbol alignment set to value greater than UINT32_MAX.
With fix: commit changes from InputFiles.cpp too.
Original commit message:
We have following code in lld, that truncates the alignment value to 32 bit. Big alignment in this case
may give result 0 and crash later.
template <class ELFT>
CommonInputSection<ELFT>::CommonInputSection(std::vector<DefinedCommon *> Syms)
: InputSection<ELFT>(nullptr, &Hdr, "") {
....
for (DefinedCommon *Sym : Syms) {
this->Alignment = std::max<uintX_t>(this->Alignment, Sym->Alignment);
...
}
}
Patch fixes the issue.
Differential revision: https://reviews.llvm.org/D25235
Added:
lld/trunk/test/ELF/invalid/Inputs/common-symbol-alignment2.elf
- copied unchanged from r283736, lld/trunk/test/ELF/invalid/Inputs/common-symbol-alignment2.elf
Modified:
lld/trunk/ELF/InputFiles.cpp
lld/trunk/test/ELF/invalid/common-symbol-alignment.s
Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=283738&r1=283737&r2=283738&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Mon Oct 10 05:31:03 2016
@@ -437,9 +437,9 @@ SymbolBody *elf::ObjectFile<ELFT>::creat
/*CanOmitFromDynSym*/ false, this)
->body();
case SHN_COMMON:
- if (Sym->st_value == 0)
+ if (Sym->st_value == 0 || Sym->st_value >= UINT32_MAX)
fatal(getFilename(this) + ": common symbol '" + Name +
- "' alignment is 0");
+ "' has invalid alignment: " + Twine(Sym->st_value));
return elf::Symtab<ELFT>::X->addCommon(Name, Sym->st_size, Sym->st_value,
Binding, Sym->st_other,
Sym->getType(), this)
Modified: lld/trunk/test/ELF/invalid/common-symbol-alignment.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid/common-symbol-alignment.s?rev=283738&r1=283737&r2=283738&view=diff
==============================================================================
--- lld/trunk/test/ELF/invalid/common-symbol-alignment.s (original)
+++ lld/trunk/test/ELF/invalid/common-symbol-alignment.s Mon Oct 10 05:31:03 2016
@@ -3,4 +3,10 @@
## common-symbol-alignment.elf contains common symbol with zero alignment.
# RUN: not ld.lld %S/Inputs/common-symbol-alignment.elf \
# RUN: -o %t 2>&1 | FileCheck %s
-# CHECK: common symbol 'bar' alignment is 0
+# CHECK: common symbol 'bar' has invalid alignment: 0
+
+## common-symbol-alignment2.elf contains common symbol alignment greater
+## than UINT32_MAX.
+# RUN: not ld.lld %S/Inputs/common-symbol-alignment2.elf \
+# RUN: -o %t 2>&1 | FileCheck %s --check-prefix=BIG
+# BIG: common symbol 'bar' has invalid alignment: 271644049215
More information about the llvm-commits
mailing list