[U-Boot] Relocation size penalty calculation

Graeme Russ
2009-10-10T08:46:52Z

On Sat, Oct 10, 2009 at 7:07 PM, Joakim Tjernlund
<joakim.tjernlund@transmode.se> wrote:
> Graeme Russ <graeme.russ@gmail.com> wrote on 10/10/2009 06:43:52:
>>
>> On Fri, Oct 9, 2009 at 10:12 AM, Joakim Tjernlund
>> <joakim.tjernlund@transmode.se> wrote:
>> >>
>> >> On Fri, Oct 9, 2009 at 9:27 AM, J. William Campbell
>> >> <jwilliamcampbell@comcast.net> wrote:
>> >> > Graeme Russ wrote:
>> >> >>
>> >> >> On Fri, Oct 9, 2009 at 2:58 AM, J. William Campbell
>> >> >> <jwilliamcampbell@comcast.net> wrote:
>> >> >>
>> >> >>>
>> >> >>> Graeme Russ wrote:
>> >> >>>
>> >> >>>>
>> >> >>>> Out of curiosity, I wanted to see just how much of a size penalty I am
>> >> >>>> incurring by using gcc -fpic / ld -pic on my x86 u-boot build. Here are
>> >> >>>> the results (fixed width font will help - its space, not tab,
>> >> >>>> formatted):
>> >> >>>>
>> >> >>>> Section non-reloc reloc
>> >> >>>> ---------------------------------------
>> >> >>>> .text 000118c4 000137fc <- 0x1f38 bytes (~8kB) bigger
>> >> >>>> .rodata 00005bad 000059d0
>> >> >>>> .interp n/a 00000013
>> >> >>>> .dynstr n/a 00000648
>> >> >>>> .hash n/a 00000428
>> >> >>>> .eh_frame 00003268 000034fc
>> >> >>>> .data 00000a6c 000001dc
>> >> >>>> .data.rel n/a 00000098
>> >> >>>> .data.rel.ro.local n/a 00000178
>> >> >>>> .data.rel.local n/a 000007e4
>> >> >>>> .got 00000000 000001f0
>> >> >>>> .got.plt n/a 0000000c
>> >> >>>> .rel.got n/a 000003e0
>> >> >>>> .rel.dyn n/a 00001228
>> >> >>>> .dynsym n/a 00000850
>> >> >>>> .dynamic n/a 00000080
>> >> >>>> .u_boot_cmd 000003c0 000003c0
>> >> >>>> .bss 00001a34 00001a34
>> >> >>>> .realmode 00000166 00000166
>> >> >>>> .bios 0000053e 0000053e
>> >> >>>> =======================================
>> >> >>>> Total 0001d5dd 00022287 <- 0x4caa bytes (~19kB) bigger
>> >> >>>>
>> >> >>>> Its more than a 16% increase in size!!!
>> >> >>>>
>> >> >>>> .text accounts for a little under half of the total bloat, and of that,
>> >> >>>> the crude dynamic loader accounts for only 341 bytes
>> >> >>>>
>> >> >>>>
>> >> >>>
>> >> >>> Hi Graeme,
>> >> >>> I would be interested in a third option (column), the x86 build with
>> >> >>> just -mrelocateable but NOT -fpic. It will not be definitive because
>> >> >>> there
>> >> >>> will be extra code that references the GOT and missing code to do some of
>> >> >>> the relocation, but it would still be interesting.
>> >> >>>
>> >> >>
>> >> >> x86 does not have -mrelocatable. This is a PPC only option :(
>> >> >>
>> >> >
>> >> > Hi Graeme,
>> >> > You are unfortunately correct. However, I wonder if we can get
>> >> > essentially the same result by executing the final ld step with the
>> >> > --emit-relocs switch included. This may also include some "extra" sections
>> >> > that we would want to strip out, but if it works, it could give all
>> >> > ELF-based systems a way to a relocatable u-boot.
>> >> >
>> >>
>> >> I don't think --emit-relocs is necessary with -pic. I haven't gone through
>> >> all the permutations to see if there is a smaller option, but gcc -fpic and
>> >> ld -pie creates enough information to perform relocation on the x86
>> >> platform
>> >
>> > Try -fvisibility=hidden
>>
>> Thanks - Shaved another 2539 bytes off the binary
>>
>> Also found out how to get rid of .eh_frame (crept in when I upgraded to
>> gcc 4.4.1) with -fno-dwarf2-cfi-asm, so that shaves another 13452 bytes
>>
>> Total saving of 15.6k
>
> Great, so now you are back at just a few percent added I guess?
>
>

Not really - The .eh_frame saving applies to both relocated and non
relocated builds

Regards,

Graeme