[U-Boot] Let's bury CONFIG_NEEDS_MANUAL_RELOC
Albert ARIBAUD
albert.u.boot at aribaud.net
Wed Feb 4 11:29:52 CET 2015
Hello Graeme,
On Wed, 04 Feb 2015 18:14:22 +1100, Graeme Russ
<gruss at tss-engineering.com> wrote:
> Hi Guys,
>
> Since I did the initial 'full relocation' for x86 way back when
> (http://git.denx.de/?p=u-boot.git;a=commit;h=1c409bc7101a24ecd47a13a4e851845d66dc23ce),
> there has been a lot of chatter about the ongoing need for
> CONFIG_NEEDS_MANUAL_RELOC. I think it's about time we looked really hard
> at this define and come to a definitive conclusion as to IF and HOW we
> can get rid of it for the remaining architectures that use it (being
> avr32, m68k, nds32, and sparc).
I second that.
> First, a bit of a primer on why and how I finally killed off
> CONFIG_NEEDS_MANUAL_RELOC for x86...
>
> Despite the best intentions of the 'manual' relocation performed by
> U-Boot, there were still instances where the U-Boot binary referenced
> the 'unrelocated' image which typically resides in flash (NOR flash in
> the case of the x86 board I was using). I only finally tracked this down
> through some arduous debugging of random crashes during the writing of a
> new U-Boot image to the NOR flash.
>
> After a lot of digging around, I managed to get a good understanding of
> the ELF binary format for x86 and compiler/linker flags needed in order
> to generate a binary image that could be relocated. It turns out that
> for x86, it was the -pic and --emit-relocs ld flags (Oddly, I cannot
> find the -pic flag in the gnu ld documentation maybe it's depricated?)
When I did the ELF relocation for ARM, only -pie existed for ld; but it
has an alias, --pic-executable. Maybe -pic is short for -pic-executable?
> The --emit-relocs flags leaves the relocation sections (for x86 the
> section of interest is .rela.dyn) in the final image. These sections
> list all the locations in the final binary that need to be adjusted if
> the image is loaded at a different address than the one it is compiled
> for. You can see the processing in do_elf_reloc_fixups() in
> arch/x86/lib/relocate.c
For ARM I just specified the placement of relocation sections in the
linker script; I'm surprised that x86 needs this --emit-relocs. Maybe
that's needed when one does not provide a custom linker script?
> Keep in mind that the relocation sections are NOT copied to RAM - they
> are only used once after U-Boot is copied to RAM to locate the memory
> locations that need to be adjusted.
>
> So the crux of generic relocation is to generate a stripped binary with
> all necessary ELF relocation information located AFTER the text and data
> sections which are copied to RAM
>
> So the first question that we need to answer is: Do the avr32, m68k,
> nds32, and sparc toolchains support the generation of the relevant
> sections needed to perform relocation in a manner similar to x86 (i.e
> generation of relocation references into sections of the final U-Boot
> binary)?
Those arches which use GCC should be able to use -pie / -pic-executable
and possibly --emit-relocs, as none of these is arch-specific.
Then, each arch might have to look into what GCC options are needed.
For the record, on ARM, I did not need any gcc option, but actually
had one -fPIC option /removed/.
> Regards,
>
> Graeme
Amicalement,
--
Albert.
More information about the U-Boot
mailing list