[PATCH 1/8] x86-64: have value properly checked when resolving fixup

H.J. Lu hjl.tools@gmail.com
Fri Apr 23 13:12:01 GMT 2021


On Fri, Apr 23, 2021 at 1:34 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> Constants not known at the time an individual insn gets assembled and
> going into a sign-extended field still shouldn't be silently truncated
> at the time the respective fixup gets resolved.
>
> gas/
> 2021-04-XX  Jan Beulich  <jbeulich@suse.com>
>
>         * config/tc-i386.c (md_apply_fix): Mark BFD_RELOC_X86_64_32S as
>         signed.
>         * testsuite/gas/i386/x86-64-addr32-bad.s,
>         testsuite/gas/i386/x86-64-addr32-bad.l: New.
>         * testsuite/gas/i386/i386.exp: Run new test.
>
> ---
> I wonder whether this isn't also related to PR gas/27763.
>
> I won't exclude that more relocation types ought to have values checked
> here (hence using switch() right away), but e.g. BFD_RELOC_{8,16,32}
> don't need to be - values not valid there get taken care of by
> write.c:fixup_segment().
>
> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -12576,7 +12576,18 @@ md_apply_fix (fixS *fixP, valueT *valP,
>
>    /* Are we finished with this relocation now?  */
>    if (fixP->fx_addsy == NULL)
> -    fixP->fx_done = 1;
> +    {
> +      fixP->fx_done = 1;
> +      switch (fixP->fx_r_type)
> +       {
> +       case BFD_RELOC_X86_64_32S:
> +         fixP->fx_signed = 1;
> +         break;
> +
> +       default:
> +         break;
> +       }
> +    }
>  #if defined (OBJ_COFF) && defined (TE_PE)
>    else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
>      {
> --- a/gas/testsuite/gas/i386/i386.exp
> +++ b/gas/testsuite/gas/i386/i386.exp
> @@ -750,6 +750,7 @@ if [gas_64_check] then {
>      run_dump_test "x86_64-intel"
>      run_dump_test "x86-64-addr32"
>      run_dump_test "x86-64-addr32-intel"
> +    run_list_test "x86-64-addr32-bad" "-al"
>      run_dump_test "x86-64-opcode"
>      run_dump_test "x86-64-intel64"
>      if { ! [istarget "*-*-*cygwin*"] && ![istarget "*-*-mingw*"] } then {
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/x86-64-addr32-bad.l
> @@ -0,0 +1,29 @@
> +.*: Assembler messages:
> +.*:3: Error:.* [0x]*88888888 .*
> +.*:7: Error:.* [0x]*99999999 .*
> +.*:11: Error:.* [0x]*99999999 .*
> +GAS LISTING .*
> +
> +
> +[      ]*[0-9]+[       ]+\.text
> +[      ]*[0-9]+[       ]+addr32:
> +[      ]*[0-9]+[       ]+lea   0x88888888\(%rax\), %rax
> +[      ]*[0-9]+[       ]+\?\?\?\? 8D808888[    ]+lea   0x88888888\(%rax\), %eax
> +[      ]*[0-9]+[       ]+8888
> +[      ]*[0-9]+[       ]+\?\?\?\? 67488D80[    ]+lea   0x88888888\(%eax\), %rax
> +[      ]*[0-9]+[       ]+88888888 *
> +[      ]*[0-9]+[       ]*
> +[      ]*[0-9]+[       ]+\?\?\?\? 488D8099[    ]+lea   value\(%rax\), %rax
> +[      ]*[0-9]+[       ]+999999
> +[      ]*[0-9]+[       ]+\?\?\?\? 8D809999[    ]+lea   value\(%rax\), %eax
> +[      ]*[0-9]+[       ]+9999
> +[      ]*[0-9]+[       ]+\?\?\?\? 67488D80[    ]+lea   value\(%eax\), %rax
> +[      ]*[0-9]+[       ]+99999999 *
> +[      ]*[0-9]+[       ]*
> +[      ]*[0-9]+[       ]+\?\?\?\? 48C7C099[    ]+mov   \$value, %rax
> +[      ]*[0-9]+[       ]+999999
> +[      ]*[0-9]+[       ]+\?\?\?\? B8999999[    ]+mov   \$value, %eax
> +[      ]*[0-9]+[       ]+99
> +[      ]*[0-9]+[       ]*
> +[      ]*[0-9]+[       ]+\.equ value, 0x99999999
> +#pass
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/x86-64-addr32-bad.s
> @@ -0,0 +1,15 @@
> +       .text
> +addr32:
> +       lea     0x88888888(%rax), %rax
> +       lea     0x88888888(%rax), %eax
> +       lea     0x88888888(%eax), %rax
> +
> +       lea     value(%rax), %rax
> +       lea     value(%rax), %eax
> +       lea     value(%eax), %rax
> +
> +       mov     $value, %rax
> +       mov     $value, %eax
> +
> +       .equ    value, 0x99999999
> +       .end
>

OK.

Thanks.

-- 
H.J.


More information about the Binutils mailing list