@@ -79,7 +79,21 @@ static intptr_t parseIndex(Parser &parser, intptr_t lb, intptr_t ub)
7979 */
8080static intptr_t parseSymbol (Parser &parser, const char *symbol)
8181{
82- intptr_t val = getELFObject (parser.elf , symbol);
82+ bool end = false ;
83+ if (parser.peekToken () == ' .' )
84+ {
85+ parser.getToken ();
86+ switch (parser.getToken ())
87+ {
88+ case TOKEN_START:
89+ break ;
90+ case TOKEN_END:
91+ end = true ; break ;
92+ default :
93+ parser.unexpectedToken ();
94+ }
95+ }
96+ intptr_t val = getELFObject (parser.elf , symbol, end);
8397 if (val == -1 )
8498 {
8599 warning (" symbol \" %s\" is undefined and therefore has value 0x0" ,
@@ -292,10 +306,27 @@ static const MatchArg parseMatchArg(Parser &parser, bool val = false)
292306 error (" failed to parse regular expression \" %s\" " , parser.s );
293307 }
294308 case ' &' :
309+ {
295310 if (parser.peekToken () == TOKEN_MEM)
296311 break ;
297- parser.expectToken2 (TOKEN_STRING, TOKEN_NAME);
298- return MatchArg (new MatchVal (parseSymbol (parser, parser.s )));
312+ std::string name;
313+ switch (parser.getToken ())
314+ {
315+ case ' .' :
316+ name += ' .' ;
317+ parser.expectToken (TOKEN_NAME);
318+ // Fallthrough:
319+ case TOKEN_NAME:
320+ name += parser.s ;
321+ break ;
322+ case TOKEN_STRING:
323+ name += parser.s ;
324+ break ;
325+ default :
326+ parser.unexpectedToken ();
327+ }
328+ return MatchArg (new MatchVal (parseSymbol (parser, name.c_str ())));
329+ }
299330 case TOKEN_NIL:
300331 return MatchArg (new MatchVal (nullptr ));
301332 case ' -' :
@@ -823,6 +854,28 @@ static const char *parseFunctionName(Parser &parser)
823854 return strDup (parser.s );
824855}
825856
857+ /*
858+ * Parse a name.
859+ */
860+ static const char *parseSymbolName (Parser &parser, int t, bool ptr)
861+ {
862+ std::string name;
863+ switch (t)
864+ {
865+ case ' .' :
866+ name += ' .' ;
867+ parser.expectToken (TOKEN_NAME);
868+ name += parser.s ;
869+ return strDup (name.c_str ());
870+ case TOKEN_NAME:
871+ return strDup (parser.s );
872+ case TOKEN_STRING:
873+ return (ptr? strDup (parser.s ): nullptr );
874+ default :
875+ return nullptr ;
876+ }
877+ }
878+
826879/*
827880 * Parse a patch.
828881 */
@@ -970,7 +1023,7 @@ const Patch *parsePatch(const ELF &elf, const char *str)
9701023 parser.expectToken (' )' );
9711024 t = parser.getToken ();
9721025 }
973- bool ptr = false , neg = false ;
1026+ bool ptr = false , end = false , neg = false ;
9741027 if (t == ' &' )
9751028 {
9761029 ptr = true ;
@@ -982,7 +1035,9 @@ const Patch *parsePatch(const ELF &elf, const char *str)
9821035 1 , 0 };
9831036 intptr_t value = 0x0 ;
9841037 int arg_token = t;
985- const char *name = nullptr ;
1038+ const char *name = parseSymbolName (parser, t, ptr);
1039+ if (name != nullptr )
1040+ t = TOKEN_NAME;
9861041 switch (t)
9871042 {
9881043 case TOKEN_ASM:
@@ -1073,7 +1128,6 @@ const Patch *parsePatch(const ELF &elf, const char *str)
10731128 ARGUMENT_STRING);
10741129 break ;
10751130 case TOKEN_NAME:
1076- name = strDup (parser.s );
10771131 arg = (parser.peekToken () == ' [' ? ARGUMENT_CSV:
10781132 ARGUMENT_SYMBOL);
10791133 break ;
@@ -1155,11 +1209,22 @@ const Patch *parsePatch(const ELF &elf, const char *str)
11551209 }
11561210 }
11571211 break ;
1158- case ARGUMENT_STRING:
1159- if (ptr)
1160- arg = ARGUMENT_SYMBOL;
1212+ case ARGUMENT_SYMBOL:
1213+ if (parser.peekToken () == ' .' )
1214+ {
1215+ parser.getToken ();
1216+ switch (parser.getToken ())
1217+ {
1218+ case TOKEN_START:
1219+ break ;
1220+ case TOKEN_END:
1221+ end = true ; break ;
1222+ default :
1223+ parser.unexpectedToken ();
1224+ }
1225+ }
11611226 break ;
1162- case ARGUMENT_MEMOP: case ARGUMENT_SYMBOL:
1227+ case ARGUMENT_MEMOP:
11631228 break ;
11641229 case ARGUMENT_REGISTER:
11651230 if ((Register)value == REGISTER_RIP)
@@ -1200,7 +1265,7 @@ const Patch *parsePatch(const ELF &elf, const char *str)
12001265 break ;
12011266 }
12021267 }
1203- args.push_back ({arg, field, ptr, _static, duplicate, cast,
1268+ args.push_back ({arg, field, ptr, end, _static, duplicate, cast,
12041269 value, memop, name});
12051270 t = parser.getToken ();
12061271 if (t == ' )' )
0 commit comments