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