[PATCH] D36140: [ELF] - Do not segfault if linkerscript tries to access Target too early.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 3 04:21:04 PDT 2017


grimar updated this revision to Diff 109514.
grimar added a comment.

- Addressed review comments.


https://reviews.llvm.org/D36140

Files:
  ELF/ScriptParser.cpp
  test/ELF/linkerscript/memory-err.s


Index: test/ELF/linkerscript/memory-err.s
===================================================================
--- test/ELF/linkerscript/memory-err.s
+++ test/ELF/linkerscript/memory-err.s
@@ -0,0 +1,10 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: echo "MEMORY { name : ORIGIN = DATA_SEGMENT_RELRO_END; }" > %t.script
+# RUN: not ld.lld -shared -o %t2 --script %t.script %t 2>&1 | FileCheck %s
+# CHECK: error: {{.*}}.script:1: unable to calculate page size
+
+# RUN: echo "MEMORY { name : ORIGIN = CONSTANT(COMMONPAGESIZE); }" > %t.script
+# RUN: not ld.lld -shared -o %t2 --script %t.script %t 2>&1 |\
+# RUN:   FileCheck %s --check-prefix=ERR2
+# ERR2: error: {{.*}}.script:1: unable to calculate page size
Index: ELF/ScriptParser.cpp
===================================================================
--- ELF/ScriptParser.cpp
+++ ELF/ScriptParser.cpp
@@ -90,6 +90,8 @@
   void readSort();
   AssertCommand *readAssert();
   Expr readAssertExpr();
+  Expr readConstant();
+  Expr getPageSize();
 
   uint64_t readMemoryAssignment(StringRef, StringRef, StringRef);
   std::pair<uint32_t, uint32_t> readMemoryAttributes();
@@ -793,13 +795,24 @@
   return Lhs;
 }
 
-uint64_t static getConstant(StringRef S) {
+Expr ScriptParser::getPageSize() {
+  std::string Location = getCurrentLocation();
+  return [=]() -> uint64_t {
+    if (Target)
+      return Target->PageSize;
+    error(Location + ": unable to calculate page size");
+    return 4096; // Return a dummy value.
+  };
+}
+
+Expr ScriptParser::readConstant() {
+  StringRef S = readParenLiteral();
   if (S == "COMMONPAGESIZE")
-    return Target->PageSize;
+    return getPageSize();
   if (S == "MAXPAGESIZE")
-    return Config->MaxPageSize;
-  error("unknown constant: " + S);
-  return 0;
+    return [=] { return Config->MaxPageSize; };
+  setError("unknown constant: " + S);
+  return {};
 }
 
 // Parses Tok as an integer. It recognizes hexadecimal (prefixed with
@@ -919,10 +932,8 @@
   }
   if (Tok == "ASSERT")
     return readAssertExpr();
-  if (Tok == "CONSTANT") {
-    StringRef Name = readParenLiteral();
-    return [=] { return getConstant(Name); };
-  }
+  if (Tok == "CONSTANT")
+    return readConstant();
   if (Tok == "DATA_SEGMENT_ALIGN") {
     expect("(");
     Expr E = readExpr();
@@ -948,7 +959,8 @@
     expect(",");
     readExpr();
     expect(")");
-    return [] { return alignTo(Script->getDot(), Target->PageSize); };
+    Expr E = getPageSize();
+    return [=] { return alignTo(Script->getDot(), E().getValue()); };
   }
   if (Tok == "DEFINED") {
     StringRef Name = readParenLiteral();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36140.109514.patch
Type: text/x-patch
Size: 2641 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170803/b4c86e3e/attachment-0001.bin>


More information about the llvm-commits mailing list