diff --git a/gas/ChangeLog b/gas/ChangeLog index 09357c85de..2c2a93eba6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2020-07-19 H.J. Lu + + PR gas/26263 + * config/tc-i386.c (i386_validate_fix): Change PLT32 reloc + against section to PC32 reloc. + * testsuite/gas/i386/relax-5.d: Updated. + * testsuite/gas/i386/x86-64-relax-4.d: Likewise. + 2020-07-15 H.J. Lu PR gas/26237 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index c0c8a291e7..ed514cf986 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -13788,11 +13788,22 @@ i386_validate_fix (fixS *fixp) } } #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) - else if (!object_64bit) + else { - if (fixp->fx_r_type == BFD_RELOC_386_GOT32 - && fixp->fx_tcbit2) - fixp->fx_r_type = BFD_RELOC_386_GOT32X; + /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol + to section. Since PLT32 relocation must be against symbols, + turn such PLT32 relocation into PC32 relocation. */ + if (fixp->fx_addsy + && (fixp->fx_r_type == BFD_RELOC_386_PLT32 + || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32) + && symbol_section_p (fixp->fx_addsy)) + fixp->fx_r_type = BFD_RELOC_32_PCREL; + if (!object_64bit) + { + if (fixp->fx_r_type == BFD_RELOC_386_GOT32 + && fixp->fx_tcbit2) + fixp->fx_r_type = BFD_RELOC_386_GOT32X; + } } #endif } diff --git a/gas/testsuite/gas/i386/relax-5.d b/gas/testsuite/gas/i386/relax-5.d index bccfe681a0..c3771330b2 100644 --- a/gas/testsuite/gas/i386/relax-5.d +++ b/gas/testsuite/gas/i386/relax-5.d @@ -10,6 +10,6 @@ Disassembly of section .text: Disassembly of section .init.text: 0+ : - +[a-f0-9]+: e8 fb ff ff ff call 0 1: R_386_PLT32 .text + +[a-f0-9]+: e8 fc ff ff ff call 1 1: R_386_PC32 .text +[a-f0-9]+: e8 fc ff ff ff call 6 6: R_386_PC32 .text #pass diff --git a/gas/testsuite/gas/i386/x86-64-relax-4.d b/gas/testsuite/gas/i386/x86-64-relax-4.d index 234e16534f..1616802245 100644 --- a/gas/testsuite/gas/i386/x86-64-relax-4.d +++ b/gas/testsuite/gas/i386/x86-64-relax-4.d @@ -12,6 +12,6 @@ Disassembly of section .text: Disassembly of section .init.text: 0+ : - +[a-f0-9]+: e8 00 00 00 00 callq 5 1: R_X86_64_PLT32 .text-0x4 + +[a-f0-9]+: e8 00 00 00 00 callq 5 1: R_X86_64_PC32 .text-0x4 +[a-f0-9]+: 48 8d 05 00 00 00 00 lea 0x0\(%rip\),%rax # c 8: R_X86_64_PC32 .text-0x4 #pass diff --git a/ld/ChangeLog b/ld/ChangeLog index ca61ce291d..3a8becc317 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2020-07-19 H.J. Lu + + PR gas/26263 + * testsuite/ld-i386/i386.exp: Run PR gas/26263 test. + * testsuite/ld-x86-64/x86-64.exp: Likewise. + * testsuite/ld-i386/pr26263.d: New file. + * testsuite/ld-x86-64/pr26263.d: Likewise. + * testsuite/ld-x86-64/pr26263.s: Likewise. + 2020-07-19 Alan Modra * emultempl/ppc64elf.em (power10-stubs): Accept optional "auto" arg. diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index e51981a38d..164c099cbb 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -469,6 +469,7 @@ run_dump_test "pr24322a" run_dump_test "pr24322b" run_dump_test "align-branch-1" run_dump_test "pr26018" +run_dump_test "pr26263" if { !([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"] diff --git a/ld/testsuite/ld-i386/pr26263.d b/ld/testsuite/ld-i386/pr26263.d new file mode 100644 index 0000000000..8cf7c15a66 --- /dev/null +++ b/ld/testsuite/ld-i386/pr26263.d @@ -0,0 +1,19 @@ +#source: ../ld-x86-64/pr26263.s +#as: --32 +#ld: -shared -melf_i386 +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +0+1000 : + +[a-f0-9]+: c3 ret + +Disassembly of section .init.text: + +0+1001 : + +[a-f0-9]+: e8 fa ff ff ff call 1000 + +[a-f0-9]+: e8 f5 ff ff ff call 1000 +#pass diff --git a/ld/testsuite/ld-x86-64/pr26263.d b/ld/testsuite/ld-x86-64/pr26263.d new file mode 100644 index 0000000000..afa96b3a2b --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr26263.d @@ -0,0 +1,18 @@ +#as: --64 +#ld: -m elf_x86_64 -shared +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +0+1000 : + +[a-f0-9]+: c3 retq + +Disassembly of section .init.text: + +0+1001 : + +[a-f0-9]+: e8 fa ff ff ff callq 1000 + +[a-f0-9]+: e8 f5 ff ff ff callq 1000 +#pass diff --git a/ld/testsuite/ld-x86-64/pr26263.s b/ld/testsuite/ld-x86-64/pr26263.s new file mode 100644 index 0000000000..5a3332cd5e --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr26263.s @@ -0,0 +1,8 @@ + .section .init.text,"ax",@progbits + .global foo +foo: + call printk + call printk@PLT + .text +printk: + ret diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index e687c42a69..21aa6a06ef 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -640,6 +640,7 @@ run_dump_test "pr20253-5b" run_dump_test "tlsdesc2" run_dump_test "pr22048" run_dump_test "pr22929" +run_dump_test "pr26263" proc undefined_weak {cflags ldflags} { set testname "Undefined weak symbol"