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

Albert ARIBAUD albert.aribaud at free.fr
Tue Oct 5 00:57:02 CEST 2010


Le 05/10/2010 00:22, Graeme Russ a écrit :
> On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud<albert.aribaud at 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.


More information about the U-Boot mailing list