x86: Resolve PLT32 reloc aganst local symbol to section
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 13 Feb 2020 21:44:17 +0000 (13:44 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 13 Feb 2020 21:44:29 +0000 (13:44 -0800)
Since PLT entry isn't needed for branch to local symbol, we can resolve
R_386_PLT32/R_X86_64_PLT32 relocation aganst local symbol to section,
similar to R_386_PC32/R_X86_64_PC32.

2020-02-13  Fangrui Song   <maskray@google.com>
    H.J. Lu  <hongjiu.lu@intel.com>

PR gas/25551
* config/tc-i386.c (tc_i386_fix_adjustable): Don't check
BFD_RELOC_386_PLT32 nor BFD_RELOC_X86_64_PLT32.
* testsuite/gas/i386/i386.exp: Run relax-5 and x86-64-relax-4.
* testsuite/gas/i386/relax-5.d: New file.
* testsuite/gas/i386/relax-5.s: Likewise.
* testsuite/gas/i386/x86-64-relax-4.d: Likewise.
* testsuite/gas/i386/x86-64-relax-4.s: Likewise.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/relax-5.d [new file with mode: 0644]
gas/testsuite/gas/i386/relax-5.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-relax-4.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-relax-4.s [new file with mode: 0644]

index 7f110e938d54e6437ebbcc5c334c2fcb09ddef7b..8d5426d7641f358c04ba89d659bbec1b26ddb722 100644 (file)
@@ -1,3 +1,15 @@
+2020-02-13  Fangrui Song   <maskray@google.com>
+           H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/25551
+       * config/tc-i386.c (tc_i386_fix_adjustable): Don't check
+       BFD_RELOC_386_PLT32 nor BFD_RELOC_X86_64_PLT32.
+       * testsuite/gas/i386/i386.exp: Run relax-5 and x86-64-relax-4.
+       * testsuite/gas/i386/relax-5.d: New file.
+       * testsuite/gas/i386/relax-5.s: Likewise.
+       * testsuite/gas/i386/x86-64-relax-4.d: Likewise.
+       * testsuite/gas/i386/x86-64-relax-4.s: Likewise.
+
 2020-02-13  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (cpu_noarch): Use CPU_ANY_SSE4_FLAGS in
index 6b923ccb81b8c3b654c7e4bcc02f4eee3d9f18e0..8e422fd2dc24c112ddedc9ed7e8d750a6d5a17f5 100644 (file)
@@ -3398,7 +3398,6 @@ tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
   if (fixP->fx_r_type == BFD_RELOC_SIZE32
       || fixP->fx_r_type == BFD_RELOC_SIZE64
       || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
-      || fixP->fx_r_type == BFD_RELOC_386_PLT32
       || fixP->fx_r_type == BFD_RELOC_386_GOT32
       || fixP->fx_r_type == BFD_RELOC_386_GOT32X
       || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
@@ -3411,7 +3410,6 @@ tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
       || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
       || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
       || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
-      || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
       || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
index 2ca8a941329002c172e18ce6c2dcd3a02f8268ae..8cace3dc9f87df9e8490b16321f6de0c906d4c85 100644 (file)
@@ -580,6 +580,7 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
 
        run_dump_test "relax-3"
        run_dump_test "relax-4"
+       run_dump_test "relax-5"
 
        run_dump_test "got"
        run_dump_test "got-no-relax"
@@ -1135,6 +1136,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
 
        run_dump_test "x86-64-relax-2"
        run_dump_test "x86-64-relax-3"
+       run_dump_test "x86-64-relax-4"
 
        run_dump_test "x86-64-jump"
        run_dump_test "x86-64-branch-2"
diff --git a/gas/testsuite/gas/i386/relax-5.d b/gas/testsuite/gas/i386/relax-5.d
new file mode 100644 (file)
index 0000000..bccfe68
--- /dev/null
@@ -0,0 +1,15 @@
+#objdump: -dwr
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <printk>:
+ +[a-f0-9]+:   c3                      ret    
+
+Disassembly of section .init.text:
+
+0+ <foo>:
+ +[a-f0-9]+:   e8 fb ff ff ff          call   0 <foo>  1: R_386_PLT32  .text
+ +[a-f0-9]+:   e8 fc ff ff ff          call   6 <foo\+0x6>     6: R_386_PC32   .text
+#pass
diff --git a/gas/testsuite/gas/i386/relax-5.s b/gas/testsuite/gas/i386/relax-5.s
new file mode 100644 (file)
index 0000000..35d5769
--- /dev/null
@@ -0,0 +1,8 @@
+       .section .init.text,"ax",@progbits
+       .global foo
+foo:
+       call    printk@PLT
+       call    printk
+       .text
+printk:
+       ret
diff --git a/gas/testsuite/gas/i386/x86-64-relax-4.d b/gas/testsuite/gas/i386/x86-64-relax-4.d
new file mode 100644 (file)
index 0000000..234e165
--- /dev/null
@@ -0,0 +1,17 @@
+#objdump: -drw
+#notarget: *-*-solaris*
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <printk>:
+ +[a-f0-9]+:   c3                      retq   
+
+Disassembly of section .init.text:
+
+0+ <foo>:
+ +[a-f0-9]+:   e8 00 00 00 00          callq  5 <foo\+0x5>     1: R_X86_64_PLT32       .text-0x4
+ +[a-f0-9]+:   48 8d 05 00 00 00 00    lea    0x0\(%rip\),%rax        # c <foo\+0xc>   8: R_X86_64_PC32        .text-0x4
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-relax-4.s b/gas/testsuite/gas/i386/x86-64-relax-4.s
new file mode 100644 (file)
index 0000000..683d3e2
--- /dev/null
@@ -0,0 +1,8 @@
+       .section .init.text,"ax",@progbits
+       .global foo
+foo:
+       call    printk
+       lea     printk(%rip), %rax
+       .text
+printk:
+       ret