]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit - ld/ldlex.h
ld script expression parsing
authorAlan Modra <amodra@gmail.com>
Sun, 31 Jan 2021 22:45:41 +0000 (09:15 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 1 Feb 2021 14:57:12 +0000 (01:27 +1030)
commit40726f16a8d7105761e36398054860a923d4efc9
tree06d77510d97baeed95b4e7f56c0c20ed5cc8bdad
parent82a1fd3a4935fe665cf08bc6820942c4a091184c
ld script expression parsing

Parsing symbol or file/section names in ld linker scripts is a little
complicated.  Inside SECTIONS, a name might be the start of an
expression or an output section.  Is ".foo=x-y" a fancy section name
or is it the expression ".foo = x - y"?  It isn't possible for a
single lookahead parser to decide, so the answer in this case is
that it's a section name.  This is the reason why everyone writes
linker script assignment expressions with lots of white-space.

However, there are many places where the parser knows for sure that an
expression is expected.  Those could be written without whitespace
given the first change to ldlex.l below.  Unfortunately, that runs
into a lookahead problem.  Optional expressions at the end of an
output section statement require the parser to look ahead one token in
expression context.  For this example from standard scripts
  .interp             : { *(.interp) }
  .note.gnu.build-id  : { *(.note.gnu.build-id) }
at the end of the .interp closing brace, the parser is looking for
a possible memspec, phdr, fill or even an optional comma.  The next
token is a NAME, but in expression context that NAME now doesn't
include '-' as a valid char.  So the lookahead NAME is
".note.gnu.build" with an unexpected "-id" syntax error before the
colon.  The rest of the patch involving ldlex_backup arranges to
discard that NAME token so that it will be rescanned in the proper
script context.

* ldgram.y (section): Call ldlex_backup.  Remove empty action.
* ldlex.h (ldlex_backup): Declare.
* ldlex.l (<EXPRESSION>NAME): Don't use NOCFILENAMECHAR set of
chars, use SYMBOLNAMECHAR.
(ldlex_backup): New function.
ld/ChangeLog
ld/ldgram.y
ld/ldlex.h
ld/ldlex.l