[PATCH] D36145: [ELF] - Do not segfault when doing logical and/or operations on symbols that have no output sections.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 1 05:57:46 PDT 2017
grimar created this revision.
Herald added a subscriber: emaste.
Previously we would crash on samples from testcase,
because were trying to access zero pointer to output section.
https://reviews.llvm.org/D36145
Files:
ELF/LinkerScript.cpp
test/ELF/linkerscript/early-assign-symbol.s
Index: test/ELF/linkerscript/early-assign-symbol.s
===================================================================
--- test/ELF/linkerscript/early-assign-symbol.s
+++ test/ELF/linkerscript/early-assign-symbol.s
@@ -7,6 +7,12 @@
# RUN: echo "SECTIONS { aaa = ABSOLUTE(foo - 1) + 1; .text : { *(.text*) } }" > %t2.script
# RUN: not ld.lld -o %t --script %t2.script %t.o 2>&1 | FileCheck %s
+# RUN: echo "SECTIONS { aaa = foo | und; .text : { *(.text*) } }" > %t3.script
+# RUN: not ld.lld -o %t --script %t3.script %t.o 2>&1 | FileCheck %s
+
+# RUN: echo "SECTIONS { aaa = foo & und; .text : { *(.text*) } }" > %t4.script
+# RUN: not ld.lld -o %t --script %t4.script %t.o 2>&1 | FileCheck %s
+
# CHECK: error: {{.*}}.script:1: unable to evaluate expression: input section .text has no output section assigned
.section .text
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -49,19 +49,24 @@
LinkerScript *elf::Script;
+static uint64_t getOutputSectionVA(SectionBase *InputSec, StringRef Loc) {
+ if (OutputSection *OS = InputSec->getOutputSection())
+ return OS->Addr;
+ error(Loc + ": unable to evaluate expression: input section " +
+ InputSec->Name + " has no output section assigned");
+ return 0;
+}
+
uint64_t ExprValue::getValue() const {
- if (Sec) {
- if (OutputSection *OS = Sec->getOutputSection())
- return alignTo(Sec->getOffset(Val) + OS->Addr, Alignment);
- error(Loc + ": unable to evaluate expression: input section " + Sec->Name +
- " has no output section assigned");
- }
+ if (Sec)
+ return alignTo(Sec->getOffset(Val) + getOutputSectionVA(Sec, Loc),
+ Alignment);
return alignTo(Val, Alignment);
}
uint64_t ExprValue::getSecAddr() const {
if (Sec)
- return Sec->getOffset(0) + Sec->getOutputSection()->Addr;
+ return Sec->getOffset(0) + getOutputSectionVA(Sec, Loc);
return 0;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36145.109095.patch
Type: text/x-patch
Size: 1997 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170801/469fe1f6/attachment.bin>
More information about the llvm-commits
mailing list