[U-Boot] [PATCH] relocation: Do not relocate NULL pointers.

Joakim Tjernlund joakim.tjernlund at transmode.se
Sun Sep 27 15:15:14 CEST 2009


Wolfgang Denk <wd at denx.de> wrote on 23/09/2009 20:23:14:
>
> Dear Peter Tyser,
>
> In message <1253710639.3968.19.camel at ptyser-laptop> you wrote:
> >
> > My "fix" to the linker script was to change:
> > __bss_start = .;
> > into:
> > __bss_start = . | 4;
> >
> > ie, a big hack, but it did work:)  I'll take a peek at a more proper
> > link script workaround.
>
> 32 bit alignment of the BSS segment might not be sufficient. Be
> careful!

Any progress on this ?

>
> > Nice!  It'd be great to have the magical 20 lines of assembly put into
> > some semi-understandable c.
>
> :-)

I have worked some more on this but all boards need to be converted to use
the new C-variants.

Anyhow, I have also been thinking/working on making U-boot
fully PIC and reached a important conclusion. The GOT holds absolute
ptr values and there is not much one can do about it sans modifying gcc.
So before u-boot is relocated to RAM one must manually add any offset to
all global/static data and string literals. The majority of strings
are passed directly to printf and friends so the offset can be added inside
printf. The remaining few data accesses needs to be dealt with directly, example:
-       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
+       for (init_fnc_ptr = got_off(init_sequence); *init_fnc_ptr; ++init_fnc_ptr) {

Only code called before relocation to RAM needs this, mostly the _f() functions.
Would this be an acceptable change?

 Jocke



More information about the U-Boot mailing list