From: Alan Modra Date: Thu, 22 Jul 2021 12:11:15 +0000 (+0930) Subject: Re: ld script expression parsing X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=553dd76c7e49e3e6afb528ff865589da8f6f3e1c;p=binutils-gdb.git Re: ld script expression parsing Commit 40726f16a8d7 broke references to sections within ADDR(), and overlays with weird section names. * ldgram.y (paren_script_name): New rule. (exp): Use it for ALIGNOF, SIZEOF, ADDR, and LOADADDR. Similarly ensure script mode parsing for section name in SEGMENT_START. (overlay_section): Delete unnecessary ldlex_script call. Backup on a lookahead NAME parsed in expression mode. * testsuite/ld-elf/overlay.s: Add more sections. * testsuite/ld-elf/overlay.t: Test '-' in section names. --- diff --git a/ld/ldgram.y b/ld/ldgram.y index 31e0071c6fc..2f9de59321a 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -96,8 +96,7 @@ static int error_index; %type section_name_list %type sect_flag_list %type sect_flags -%type memspec_opt casesymlist -%type memspec_at_opt +%type memspec_opt memspec_at_opt paren_script_name casesymlist %type wildcard_name %type section_name_spec filename_spec wildcard_maybe_exclude %token INT @@ -906,6 +905,10 @@ nocrossref_list: } ; +paren_script_name: + { ldlex_script (); } '(' NAME { ldlex_popstate (); } ')' + { $$ = $3; } + mustbe_exp: { ldlex_expression (); } exp { ldlex_popstate (); $$=$2;} @@ -970,14 +973,14 @@ exp : | SIZEOF_HEADERS { $$ = exp_nameop (SIZEOF_HEADERS,0); } - | ALIGNOF '(' NAME ')' - { $$ = exp_nameop (ALIGNOF,$3); } - | SIZEOF '(' NAME ')' - { $$ = exp_nameop (SIZEOF,$3); } - | ADDR '(' NAME ')' - { $$ = exp_nameop (ADDR,$3); } - | LOADADDR '(' NAME ')' - { $$ = exp_nameop (LOADADDR,$3); } + | ALIGNOF paren_script_name + { $$ = exp_nameop (ALIGNOF, $2); } + | SIZEOF paren_script_name + { $$ = exp_nameop (SIZEOF, $2); } + | ADDR paren_script_name + { $$ = exp_nameop (ADDR, $2); } + | LOADADDR paren_script_name + { $$ = exp_nameop (LOADADDR, $2); } | CONSTANT '(' NAME ')' { $$ = exp_nameop (CONSTANT,$3); } | ABSOLUTE '(' exp ')' @@ -992,15 +995,16 @@ exp : { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); } | DATA_SEGMENT_END '(' exp ')' { $$ = exp_unop (DATA_SEGMENT_END, $3); } - | SEGMENT_START '(' NAME ',' exp ')' + | SEGMENT_START { ldlex_script (); } '(' NAME + { ldlex_popstate (); } ',' exp ')' { /* The operands to the expression node are placed in the opposite order from the way in which they appear in the script as that allows us to reuse more code in fold_binary. */ $$ = exp_binop (SEGMENT_START, - $5, - exp_nameop (NAME, $3)); } + $7, + exp_nameop (NAME, $4)); } | BLOCK '(' exp ')' { $$ = exp_unop (ALIGN_K,$3); } | NAME @@ -1186,13 +1190,17 @@ overlay_section: | overlay_section NAME { - ldlex_script (); lang_enter_overlay_section ($2); } '{' statement_list_opt '}' - { ldlex_popstate (); ldlex_expression (); } + { ldlex_expression (); } phdr_opt fill_opt { + if (yychar == NAME) + { + yyclearin; + ldlex_backup (); + } ldlex_popstate (); lang_leave_overlay_section ($9, $8); } diff --git a/ld/testsuite/ld-elf/overlay.s b/ld/testsuite/ld-elf/overlay.s index f153044e31b..20d8f4154dc 100644 --- a/ld/testsuite/ld-elf/overlay.s +++ b/ld/testsuite/ld-elf/overlay.s @@ -2,5 +2,9 @@ .space 0x10 .section .text2,"ax",%progbits .space 0x20 + .section .silly-name1,"ax",%progbits + .space 0x10 + .section .silly-name2,"ax",%progbits + .space 0x20 .text .space 0x30 diff --git a/ld/testsuite/ld-elf/overlay.t b/ld/testsuite/ld-elf/overlay.t index dd374bb68b8..2c50a6b1a48 100644 --- a/ld/testsuite/ld-elf/overlay.t +++ b/ld/testsuite/ld-elf/overlay.t @@ -6,6 +6,10 @@ SECTIONS { .text1 {*(.text1)} .text2 {*(.text2)} - } + .silly-name1 { *(.silly-name1) } + .silly-name2 { *(.silly-name2) } + } /DISCARD/ : { *(.*) } + ASSERT(ADDR(.text1)==ADDR(.text2), "overlay error") + ASSERT(ADDR(.silly-name1)==ADDR(.silly-name2), "silly overlay error") }