From b818855549013ba43e730e07f790e5cbfd16a757 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 26 Apr 2021 10:35:51 +0200 Subject: [PATCH] x86-64: have value properly checked when resolving fixup 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/ChangeLog | 8 ++++++ gas/config/tc-i386.c | 13 +++++++++- gas/testsuite/gas/i386/i386.exp | 1 + gas/testsuite/gas/i386/x86-64-addr32-bad.l | 29 ++++++++++++++++++++++ gas/testsuite/gas/i386/x86-64-addr32-bad.s | 15 +++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 gas/testsuite/gas/i386/x86-64-addr32-bad.l create mode 100644 gas/testsuite/gas/i386/x86-64-addr32-bad.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 696d728d8c7..585c98b2521 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2021-04-26 Jan Beulich + + * 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. + 2021-04-23 Eric Botcazou * testsuite/gas/elf/section25.d: Run it everywhere. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index dc1ee881a20..1f9844dcb52 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -12576,7 +12576,18 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) /* 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)) { diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index e1dab453b42..a9a2a6403bb 100644 --- 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 { diff --git a/gas/testsuite/gas/i386/x86-64-addr32-bad.l b/gas/testsuite/gas/i386/x86-64-addr32-bad.l new file mode 100644 index 00000000000..bddf0d143d6 --- /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 diff --git a/gas/testsuite/gas/i386/x86-64-addr32-bad.s b/gas/testsuite/gas/i386/x86-64-addr32-bad.s new file mode 100644 index 00000000000..460be2012e0 --- /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 -- 2.30.2