[U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations

Albert ARIBAUD
2010-10-04T22:57:02Z

Le 05/10/2010 00:22, Graeme Russ a ?crit :
> On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud<albert.aribaud@free.fr> wrote:
>> This patch is *not* a submission for master!
>>
>> It is a proof of concept of ELF relocations for ARM, hastily done
>> in a day's work time for people on the list to try and to comment.
>> All comments are welcome, as several suggestions have been made
>> today on the list that I did not have time to incorporate, such as
>> rewriting the elf table fixup code in C.
>
> Yes, this would be nice. I imagine it would look somewhat like the version
> for x86. It would be nice to have a generic function which will work for
> all arches.
>
> [snip]
>
>> With GOT relocs:
>>
>> text data bss dec hex filename .bin size
>> 141376 4388 16640 162404 27a64 ./u-boot 145764
>>
>> With ELF relocs:
>>
>> text data bss dec hex filename .bin size
>> 149677 3727 16636 170040 29838 ./u-boot 153408
>
> Hmm, I'm a bit suprised by the text increase - Can you provide a more
> detailed breakdown of before and after sizes by section?

The output from MAKEALL is curiously calculated... If I look at objdumps
of the GOT and ELF binaries, I find that:

- the GOT .text section is 118960 bytes and the ELF .text section only
108112. This is due to the fact that GOT relocation requires additional
instruction for GOT indirection whereas ELF relocations work by patching
the code.

- the .rodata section is 22416 for GOT, 22698 for ELF, whereas the .data
section is 2908 for GOT, 2627 for ELF. Some initialized data apparently
moved from non-const ton const for some reason, but basically,
initialized data remains constant.

- the .bss section remains constant too, 16640 for GOT vs. 16636 for
ELF. I'm not going to track what causes the 4 byte difference. :)

Many sections are output in the ELF file which do not appear in the GOT
file, such as .interp, .dynamic, .dynstr etc. They probably pollute
MAKEALL's figures.

So actually the code (.text+.rodata+.data) is smaller for ELF than for
GOT (which is normal as GOT causes adding indirection instructions
whereas ELF does not alter the code size) but the .rel.dyn is way bigger
than the .got (which is also normal as GOT does not relocate all that
ELF does).

> As I have mentioned before, x86 has an in-RAM increase of only 284 bytes
> (0.3 %) with an additional 22424 bytes in .rel.dyn

That's roughly consistent with the numbers I get: about 19 KB of
.rel.dyn plus .dynsym, which we will be able to cut by half if we
preprocess it.

> Regards,
>
> Graeme

Amicalement,
--
Albert.