On Tue, Oct 05, 2010 at 11:56:55AM -0700, Richard Henderson wrote: > On 10/05/2010 06:54 AM, Joakim Tjernlund wrote: > > Ian Lance Taylor <i...@google.com> wrote on 2010/10/05 15:47:38: > >> Joakim Tjernlund <joakim.tjernl...@transmode.se> writes: > >>> While doing relocation work on u-boot I often whish for strings/const data > >>> to be accessible through %pc relative address rather than and ABS address > >>> or through GOT. Has this feature ever been considered by gcc? > >> > >> The feature can only be supported on processors which are reasonably > >> able to support it. So, what target are you asking about? > > > > In my case PowerPC but I think most arch's would want this feature. > > Is there arch's where this cannot be support at all or just within > > some limits? I think within limits could work for small apps > > like u-boot. > > PowerPC doesn't really have the relocations for pc-relative offsets > within code -- primarily because it doesn't have pc-relative insns > to match. Nor, unfortunately, does it have got-relative relocations, > like some other targets. These are normally how we get around not > having pc-relative relocations and avoiding tables in memory. C.f.
The new PowerPC medium code model for 64-bit now uses GOT-relative relocations for local data: The compiler issues (r2 has the TOC/GOT pointer): addis <reg>,r2,la...@toc@ha addi <reg2>,<reg>,la...@toc@l to load the address in <reg2>. If the data happens to be within 32K of the TOC pointer, the linker will transform this to: nop addi <reg2>,r2,la...@toc@l For non-local loads or the large code model, the compiler issues: addis <reg>,r2,la...@got@ha ld <reg2>,la...@got@l(<reg>) If the address happens to be defined in the current program unit (main program or shared librar), the linker can transform this to: addis <reg>,r2,la...@toc@ha addi <reg2>,<reg>,la...@toc@l or: nop addi <reg2>,r2,la...@toc@l or: nop ld <reg2>,la...@got@l(r2) -- Michael Meissner, IBM 5 Technology Place Drive, M/S 2757, Westford, MA 01886-3141, USA meiss...@linux.vnet.ibm.com