summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputFiles.cpp4
-rw-r--r--lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elfbin0 -> 456 bytes
-rw-r--r--lld/test/ELF/invalid/common-symbol-alignment.s8
3 files changed, 9 insertions, 3 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index cc8a8492327..e3266f17634 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -437,9 +437,9 @@ SymbolBody *elf::ObjectFile<ELFT>::createSymbolBody(const Elf_Sym *Sym) {
/*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)
diff --git a/lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf b/lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf
new file mode 100644
index 00000000000..21c2457cbea
--- /dev/null
+++ b/lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf
Binary files differ
diff --git a/lld/test/ELF/invalid/common-symbol-alignment.s b/lld/test/ELF/invalid/common-symbol-alignment.s
index 671205f87cc..2a654b11479 100644
--- a/lld/test/ELF/invalid/common-symbol-alignment.s
+++ b/lld/test/ELF/invalid/common-symbol-alignment.s
@@ -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
OpenPOWER on IntegriCloud