This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] ld: Don't allow '~' as the first char in symbol name
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: binutils at sourceware dot org
- Date: Fri, 6 Oct 2017 20:30:53 -0700
- Subject: [PATCH] ld: Don't allow '~' as the first char in symbol name
- Authentication-results: sourceware.org; auth=none
Don't allow '~' as the first character in symbol name in linker script.
OK for master?
H.J.
---
PR ld/22267
* ldlex.l (SYMBOLNAMECHAR1) New.
(DEFSYMEXP): Replace FILENAMECHAR1 with SYMBOLNAMECHAR1.
(EXPRESSION): Likewise.
* testsuite/ld-scripts/expr.exp: Run pr22267.
* testsuite/ld-scripts/pr22267.d: New file.
* testsuite/ld-scripts/pr22267.s: Likewise.
* testsuite/ld-scripts/pr22267.t: Likewise.
---
ld/ldlex.l | 5 +++--
ld/testsuite/ld-scripts/expr.exp | 1 +
ld/testsuite/ld-scripts/pr22267.d | 7 +++++++
ld/testsuite/ld-scripts/pr22267.s | 10 ++++++++++
ld/testsuite/ld-scripts/pr22267.t | 4 ++++
5 files changed, 25 insertions(+), 2 deletions(-)
create mode 100644 ld/testsuite/ld-scripts/pr22267.d
create mode 100644 ld/testsuite/ld-scripts/pr22267.s
create mode 100644 ld/testsuite/ld-scripts/pr22267.t
diff --git a/ld/ldlex.l b/ld/ldlex.l
index ba618ecc27..795a4d7c8e 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -94,6 +94,7 @@ static void lex_warn_invalid (char *where, char *what);
CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~]
+SYMBOLNAMECHAR1 [_a-zA-Z\/\.\\\$\_]
SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9]
FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!]
@@ -136,7 +137,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
<DEFSYMEXP>"-" { RTOKEN('-');}
<DEFSYMEXP>"+" { RTOKEN('+');}
-<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
+<DEFSYMEXP>{SYMBOLNAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
<DEFSYMEXP>"=" { RTOKEN('='); }
<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
@@ -390,7 +391,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
yylval.name = xstrdup (yytext + 2);
return LNAME;
}
-<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
+<EXPRESSION>{SYMBOLNAMECHAR1}{NOCFILENAMECHAR}* {
yylval.name = xstrdup (yytext);
return NAME;
}
diff --git a/ld/testsuite/ld-scripts/expr.exp b/ld/testsuite/ld-scripts/expr.exp
index 9db5366c12..62d45dc5de 100644
--- a/ld/testsuite/ld-scripts/expr.exp
+++ b/ld/testsuite/ld-scripts/expr.exp
@@ -25,6 +25,7 @@ run_dump_test sane1
run_dump_test assign-loc
run_dump_test pr14962
run_dump_test pr14962-2
+run_dump_test pr22267
set old_ldflags $LDFLAGS
if { [istarget spu*-*-*] } {
diff --git a/ld/testsuite/ld-scripts/pr22267.d b/ld/testsuite/ld-scripts/pr22267.d
new file mode 100644
index 0000000000..f66d4be49c
--- /dev/null
+++ b/ld/testsuite/ld-scripts/pr22267.d
@@ -0,0 +1,7 @@
+#ld: -T pr22267.t
+#nm: -n
+
+# Some targets may zero-extend 32-bit address to 64 bits.
+#...
+0*f+00 A foo
+#pass
diff --git a/ld/testsuite/ld-scripts/pr22267.s b/ld/testsuite/ld-scripts/pr22267.s
new file mode 100644
index 0000000000..c0a5cda6e9
--- /dev/null
+++ b/ld/testsuite/ld-scripts/pr22267.s
@@ -0,0 +1,10 @@
+ .globl main
+ .globl start
+ .globl _start
+ .globl __start
+ .text
+main:
+start:
+_start:
+__start:
+ .dc.a foo
diff --git a/ld/testsuite/ld-scripts/pr22267.t b/ld/testsuite/ld-scripts/pr22267.t
new file mode 100644
index 0000000000..a0754058e5
--- /dev/null
+++ b/ld/testsuite/ld-scripts/pr22267.t
@@ -0,0 +1,4 @@
+SECTIONS
+{
+ foo = ~0xFF;
+}
--
2.13.6