[U-Boot] [PATCH] mpc83xx: Add -fpic relocation support

Joakim Tjernlund joakim.tjernlund at transmode.se
Tue Oct 12 23:00:29 CEST 2010


Albert ARIBAUD <albert.aribaud at free.fr> wrote on 2010/10/12 22:37:54:
> 
> Le 12/10/2010 20:11, Joakim Tjernlund a écrit :
> >>
> >> Le 12/10/2010 19:11, Joakim Tjernlund a écrit :
> >>
> >>> Figured I should mention that I have added -msingle-pic-base(from 
ARM)
> >>> which
> >>> works nicely with -fpic(not sure if -fPIC is possible) and reduces
> > size
> >>> even more:
> >>
> >> Since you seem to be following the same path as I did on ARM, I may 
as
> >> well ask: did you try removing -fPIC and -msingle-pic-base from 
compile
> >> options and adding -pie to the link options instead?
> >
> > looked at it briefly but -pie is really massive. Each access needs
> > a reloc entry, even if they access the same data.
> 
> OTOH, the accesses are as simple as without reloc, i.e. no indirection

On ppc that is more work than via the GOT (with -fpic at least). You need
two insn to load the address to a register compared with one to get
it from the GOT.
 
> as GOT introduces. What is the size of the .rel.dyn and .dynsym 
sections?

Don't have that handy.

> 
> >> Link option -pie generates ELF relocation and, on ARM at least, does 
a
> >> better job than GOT reloc, which does not fix handle pointers in
> >> initialized data while ELF reloc fixes them.
> >
> > on ppc -mrelocatable does the job for you and adds fixup relocs.
> > It a simple addon that should be fairly easy to add to other archs 
too.
> 
> It does not exist on ARM targets whereas -pie is general.

I know, I meant you could consider adding it to ARM.

> 
> >> And since ELF reloc does not modify code (it is a linker option), you
> >
> > ehh, I think you need to reloc directly in the text segment.
> 
> I meant that it does not cause the compiler to generate a different 
> code, whereas GOT relocation generates a different code, which causes 
> the text section to grow.

Not really, it is about the same(2 insn vs. 1 insn and 1 GOT entry).
What builds size is the PIC prologue to load the GOT ptr, but that can
be avoided with -msingle-pic-base

> 
> >> end up with the same size for text+data+rodata. You do have a bigger
> >> FLASH image though, because the ELF reloc tables are bigger than the 
GOT
> >
> >> table; but you can git rid of them / not copy them to RAM once
> > relocated.
> >
> > I don't think RAM is as much as a problem as flash is.
> 
> Indeed in some cases it isnt; but you gain some boot time if you don't 
> have to copy the relocation table along with the code.
> 
> >> The move from -fPIC to ELF on ARM can be looked for in the elf_reloc
> >> branch of the u-boot-arm repo.
> >
> > Yes, but I believe the ppc way is smaller once -fpic and 
-msingle-pic-base
> > are used(In flash anyway).
> > Also, I don't think you will be able to do true PIC in the
> > future without PIC code.
> 
> Problem is, -fPIC / -fPIE (I tried both) is not really position 
> independent either, and requires ugly manual relocation. Besides, for 
> the moment, true position independence is not required, although I'd 
> like at least the u-boot FLASH startup code to be.

hmm, can't remember but I think need -pie too(for the fixups). Then you
can test with/without -fpic. If -fpic is similar to ppc -fpic, you 
probably
get smaller code than with -fPIC. Then add -msingle-pic-base too.

> 
> I do understand, though, that ppc and arm may not share a common optimal 

> relocation method.

Yes, but the difference isn't really the arch. It is the -mrelocatable 
flag
that is the big difference.



More information about the U-Boot mailing list