[lld] [ELF] Reject error-prone meta characters in input section description (PR #84130)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 5 23:54:41 PST 2024
https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/84130
Our lexing rule is loose and recognizes certain non-wildcard meta
characters as input file patterns. This can be confusing in certain
cases, e.g.
`*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.text*)) } PROVIDE_HIDDEN(__code_end = .)`
(`}` without a closing `)`) (#81804).
Ideally, the lexer should be state-aware to report more errors like GNU
ld, but that would require a large rewrite. For now, just report errors
for one of `(){}` used as an input file pattern.
>From 080332916e4be95f012a89a54a04d0a85bb61d92 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Tue, 5 Mar 2024 23:54:31 -0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.5-bogner
---
lld/ELF/ScriptParser.cpp | 14 ++++++++++++--
lld/test/ELF/linkerscript/wildcards.s | 21 ++++++++++++++-------
2 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index f0ede1f43bbdb3..282f95bd04b085 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -717,9 +717,19 @@ SmallVector<SectionPattern, 0> ScriptParser::readInputSectionsList() {
StringMatcher SectionMatcher;
// Break if the next token is ), EXCLUDE_FILE, or SORT*.
- while (!errorCount() && peek() != ")" && peek() != "EXCLUDE_FILE" &&
- peekSortKind() == SortSectionPolicy::Default)
+ while (!errorCount() && peekSortKind() == SortSectionPolicy::Default) {
+ StringRef s = peek();
+ if (s == ")" || s == "EXCLUDE_FILE")
+ break;
+ // Detect common mistakes that certain non-wildcard meta characters used
+ // without a closing ')'.
+ if (s.size() == 1 && strchr("(){}", s[0])) {
+ skip();
+ setError("section pattern is expected");
+ break;
+ }
SectionMatcher.addPattern(unquote(next()));
+ }
if (!SectionMatcher.empty())
ret.push_back({std::move(excludeFilePat), std::move(SectionMatcher)});
diff --git a/lld/test/ELF/linkerscript/wildcards.s b/lld/test/ELF/linkerscript/wildcards.s
index 1eea27891dfc2c..24d4102559c95e 100644
--- a/lld/test/ELF/linkerscript/wildcards.s
+++ b/lld/test/ELF/linkerscript/wildcards.s
@@ -91,24 +91,31 @@ SECTIONS {
.text : { *([.]abc .ab[v-y] ) }
}
-## Test a few non-wildcard meta characters rejected by GNU ld.
+## Test a few non-wildcard characters rejected by GNU ld.
#--- lbrace.lds
-# RUN: ld.lld -T lbrace.lds a.o -o out
+# RUN: not ld.lld -T lbrace.lds a.o 2>&1 | FileCheck %s --check-prefix=ERR-LBRACE --match-full-lines --strict-whitespace
+# ERR-LBRACE:{{.*}}: section pattern is expected
+# ERR-LBRACE-NEXT:>>> .text : { *(.a* { ) }
+# ERR-LBRACE-NEXT:>>> ^
SECTIONS {
.text : { *(.a* { ) }
}
#--- lparen.lds
-## ( is recognized as a section name pattern. Note, ( is rejected by GNU ld.
-# RUN: ld.lld -T lparen.lds a.o -o out
-# RUN: llvm-objdump --section-headers out | FileCheck --check-prefix=SEC-NO %s
+# RUN: not ld.lld -T lparen.lds a.o 2>&1 | FileCheck %s --check-prefix=ERR-LPAREN --match-full-lines --strict-whitespace
+# ERR-LPAREN:{{.*}}: section pattern is expected
+# ERR-LPAREN-NEXT:>>> .text : { *(.a* ( ) }
+# ERR-LPAREN-NEXT:>>> ^
SECTIONS {
- .text : { *(.a* ( ) }
+ .text : { *(.a* ( ) }
}
#--- rbrace.lds
-# RUN: ld.lld -T rbrace.lds a.o -o out
+# RUN: not ld.lld -T rbrace.lds a.o 2>&1 | FileCheck %s --check-prefix=ERR-RBRACE --match-full-lines --strict-whitespace
+# ERR-RBRACE:{{.*}}: section pattern is expected
+# ERR-RBRACE-NEXT:>>> .text : { *(.a* } ) }
+# ERR-RBRACE-NEXT:>>> ^
SECTIONS {
.text : { *(.a* } ) }
}
More information about the llvm-commits
mailing list