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