[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
Wed Aug 2 01:52:45 PDT 2017
grimar updated this revision to Diff 109297.
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 readConstantExpr();
+ Expr getPageSizeExpr();
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::getPageSizeExpr() {
+ std::string Location = getCurrentLocation();
+ return [=] {
+ if (Target)
+ return (uint64_t)Target->PageSize;
+ error(Location + ": unable to calculate page size");
+ return (uint64_t)4096; // Return a dummy value.
+ };
+}
+
+Expr ScriptParser::readConstantExpr() {
+ StringRef S = readParenLiteral();
if (S == "COMMONPAGESIZE")
- return Target->PageSize;
+ return getPageSizeExpr();
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 readConstantExpr();
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 = getPageSizeExpr();
+ return [=] { return alignTo(Script->getDot(), E().getValue()); };
}
if (Tok == "DEFINED") {
StringRef Name = readParenLiteral();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36140.109297.patch
Type: text/x-patch
Size: 2675 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170802/b6a578f8/attachment.bin>
More information about the llvm-commits
mailing list