Re: Add patch "x86: Treat R_X86_64_PLT32 as R_X86_64_PC32" to stable?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Mar 15, 2018 at 04:36:23PM -0700, Matthias Kaehlcke wrote:
> Hi Greg,
> 
> The below patch recently landed in Linus' tree:
> 
> commit b21ebf2fb4cde1618915a97cc773e287ff49173e
> Author: H.J. Lu <hjl.tools@xxxxxxxxx>
> Date:   Wed Feb 7 14:20:09 2018 -0800
> 
>     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.
> 
>     R_X86_64_PLT32 for 32-bit PC-relative branches has been enabled in
>     binutils master branch which will become binutils 2.31.
> 
>     [ hjl is working on having better documentation on this all, but a few
>       more notes from him:
> 
>        "PLT32 relocation is used as marker for PC-relative branches. Because
>         of EBX, it looks odd to generate PLT32 relocation on i386 when EBX
>         doesn't have GOT.
> 
>         As for symbol resolution, PLT32 and PC32 relocations are almost
>         interchangeable. But when linker sees PLT32 relocation against a
>         protected symbol, it can resolved locally at link-time since it is
>         used on a branch instruction. Linker can't do that for PC32
>         relocation"
> 
>       but for the kernel use, the two are basically the same, and this
>       commit gets things building and working with the current binutils
>       master   - Linus ]
> 
>     Signed-off-by: H.J. Lu <hjl.tools@xxxxxxxxx>
>     Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> 
> 
> The commit message mentions that "R_X86_64_PLT32 for 32-bit
> PC-relative branches has been enabled in binutils master branch which
> will become binutils 2.31."
> 
> This probably means that builds of older kernels could fail with
> binutils >= 2.31 and that the patch should be included in stable.
> 
> FYI: for pre-v4.14 kernel you might also want to include the below
> patch. It isn't strictly needed, but is trivial and including it
> avoids a conflict.
> 
> commit eda9cec4c9a12208a6f69fbe68f72a6311d50032
> Author: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> Date:   Fri Nov 3 07:58:54 2017 -0500
> 
>     x86/module: Detect and skip invalid relocations
> 

Thanks for the info, both patches are now queued up.

greg k-h



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]