On Mon, May 20, 2019 at 04:19:54PM +0930, Alan Modra wrote: > On Thu, May 16, 2019 at 05:52:42PM -0500, Segher Boessenkool wrote: > > Hi Umesh, > > > > On Thu, May 16, 2019 at 06:12:48PM +0530, Umesh Kalappa wrote: > > > We are very new to Power abi and we are thinking to handle this case > > > in loader like go through the relocations like R_PPC64_REL24 and > > > found symbol has the localentry ,then compute the delta (GEP - LEP ) > > > and patch the caller address like (sym.value - delta). > > > > I wonder if you have found a bug in the compiler after all. Most things > > are supposed to work without the linker/loader having to do special > > things; e.g. using the global entry point should always work, using the > > local entry point is just an optimisation. > > That isn't true for direct calls. If using the global entry point, > the linker must provide stub code to load up r12 with the global entry > address and modify the nop after the bl. The linker must also adjust > calls using the local entry point; the call instruction (and > relocation) specify the function symbol not the function plus local > entry offset. > > So I don't think there is any compiler bug here, just a broken kernel > module loader. Incidentally, if thunks are broken then it's very > likely local function calls are broken too.
The ABI says "When a linker causes control to transfer to a global entry point, it must insert a glue code sequence that loads r12 with the global entry-point address. Code at the global entry point can assume that register r12 points to the GEP." But in the testcase the jump *already* was to the global entry point: .globl _ZN12Intermediate1vEv ... .set .LTHUNK0,_ZN12Intermediate1vEv ... .globl _ZThn8_N12Intermediate1vEv .type _ZThn8_N12Intermediate1vEv, @function _ZThn8_N12Intermediate1vEv: .cfi_startproc .LCF2: 0: addis 2,12,.TOC.-.LCF2@ha addi 2,2,.TOC.-.LCF2@l .localentry _ZThn8_N12Intermediate1vEv,.-_ZThn8_N12Intermediate1vEv addi 3,3,-8 b .LTHUNK0 .cfi_endproc .LFE27: .size _ZThn8_N12Intermediate1vEv,.-_ZThn8_N12Intermediate1vEv Segher