x86-64: Generate branch with PLT32 relocation
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 13 Feb 2018 15:34:22 +0000 (07:34 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 13 Feb 2018 15:34:36 +0000 (07:34 -0800)
commitbd7ab16b4537788ad53521c45469a1bdae84ad4a
tree375430fcb7deb06890838718c27b204f405c5fae
parent80c96350467f23a54546580b3e2b67a65ec65b66
x86-64: Generate branch with PLT32 relocation

Since there is no need to prepare for PLT branch on x86-64, generate
R_X86_64_PLT32, instead of R_X86_64_PC32, if possible, which can be
used as a marker for 32-bit PC-relative branches.

To compile Linux kernel, this patch:

From: "H.J. Lu" <hjl.tools@gmail.com>
Subject: [PATCH] x86: Treat R_X86_64_PLT32 as R_X86_64_PC32

On i386, there are 2 types of PLTs, PIC and non-PIC.  PIE and shared
objects must use PIC PLT.  To use PIC PLT, you need to load
_GLOBAL_OFFSET_TABLE_ into EBX first.  There is no need for that on
x86-64 since x86-64 uses PC-relative PLT.

On x86-64, for 32-bit PC-relative branches, we can generate PLT32
relocation, instead of PC32 relocation, which can also be used as
a marker for 32-bit PC-relative branches.  Linker can always reduce
PLT32 relocation to PC32 if function is defined locally.   Local
functions should use PC32 relocation.  As far as Linux kernel is
concerned, R_X86_64_PLT32 can be treated the same as R_X86_64_PC32
since Linux kernel doesn't use PLT.

is needed.  It is available on hjl/plt32/master branch at

https://github.com/hjl-tools/linux

bfd/

PR gas/22791
* elf64-x86-64.c (is_32bit_relative_branch): Removed.
(elf_x86_64_relocate_section): Check PIC relocations in PIE.
Remove is_32bit_relative_branch usage.  Disallow PC32 reloc
against protected function in shared object.

gas/

PR gas/22791
* config/tc-i386.c (need_plt32_p): New function.
(output_jump): Generate BFD_RELOC_X86_64_PLT32 if possible.
(md_estimate_size_before_relax): Likewise.
* testsuite/gas/i386/reloc64.d: Updated.
* testsuite/gas/i386/x86-64-jump.d: Likewise.
* testsuite/gas/i386/x86-64-mpx-branch-1.d: Likewise.
* testsuite/gas/i386/x86-64-mpx-branch-2.d: Likewise.
* testsuite/gas/i386/x86-64-relax-2.d: Likewise.
* testsuite/gas/i386/x86-64-relax-3.d: Likewise.
* testsuite/gas/i386/ilp32/reloc64.d: Likewise.
* testsuite/gas/i386/ilp32/x86-64-branch.d: Likewise.

ld/

PR gas/22791
* testsuite/ld-x86-64/mpx1c.rd: Updated.
* testsuite/ld-x86-64/pr22791-1.err: New file.
* testsuite/ld-x86-64/pr22791-1a.c: Likewise.
* testsuite/ld-x86-64/pr22791-1b.s: Likewise.
* testsuite/ld-x86-64/pr22791-2.rd: Likewise.
* testsuite/ld-x86-64/pr22791-2a.s: Likewise.
* testsuite/ld-x86-64/pr22791-2b.c: Likewise.
* testsuite/ld-x86-64/pr22791-2c.s: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/22791 tests.
22 files changed:
bfd/ChangeLog
bfd/elf64-x86-64.c
gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/ilp32/reloc64.d
gas/testsuite/gas/i386/ilp32/x86-64-branch.d
gas/testsuite/gas/i386/reloc64.d
gas/testsuite/gas/i386/x86-64-jump.d
gas/testsuite/gas/i386/x86-64-mpx-branch-1.d
gas/testsuite/gas/i386/x86-64-mpx-branch-2.d
gas/testsuite/gas/i386/x86-64-relax-2.d
gas/testsuite/gas/i386/x86-64-relax-3.d
ld/ChangeLog
ld/testsuite/ld-x86-64/mpx1c.rd
ld/testsuite/ld-x86-64/pr22791-1.err [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22791-1a.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22791-1b.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22791-2.rd [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22791-2a.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22791-2b.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22791-2c.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp