[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
Mon Aug 21 00:58:20 PDT 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL311311: [ELF] - Do not segfault when doing logical and/or operations on symbols that… (authored by grimar).

Changed prior to commit:
  https://reviews.llvm.org/D36145?vs=111624&id=111934#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D36145

Files:
  lld/trunk/ELF/LinkerScript.cpp
  lld/trunk/test/ELF/linkerscript/early-assign-symbol.s


Index: lld/trunk/ELF/LinkerScript.cpp
===================================================================
--- lld/trunk/ELF/LinkerScript.cpp
+++ lld/trunk/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;
 }
 
Index: lld/trunk/test/ELF/linkerscript/early-assign-symbol.s
===================================================================
--- lld/trunk/test/ELF/linkerscript/early-assign-symbol.s
+++ lld/trunk/test/ELF/linkerscript/early-assign-symbol.s
@@ -7,6 +7,9 @@
 # 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 | 1; .text  : { *(.text*) } }" > %t3.script
+# RUN: not ld.lld -o %t --script %t3.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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36145.111934.patch
Type: text/x-patch
Size: 1901 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170821/07acec17/attachment.bin>


More information about the llvm-commits mailing list