[U-Boot] [PATCH v3 2/2] MIPS: Stop building position independent code

Álvaro Fernández Rojas noltari at gmail.com
Sun Jul 30 12:27:13 UTC 2017


I've been a bit busy lately and I couldn't test this until now, but I have to say that this commit breaks u-boot bmips support :(

BTW, I tried this on several bmips boards (one of them is a Netgear CG3100D, which uses u-boot.bin instead of u-boot.elf)

Do you have any idea on what could be hapenning?

Regards,
Álvaro.

El 23/06/2017 a las 17:21, Daniel Schwierzeck escribió:
> 
> 
> Am 19.06.2017 um 20:53 schrieb Paul Burton:
>> U-Boot has up until now built with -fpic for the MIPS architecture,
>> producing position independent code which uses indirection through a
>> global offset table, making relocation fairly straightforward as it
>> simply involves patching up GOT entries.
>>
>> Using -fpic does however have some downsides. The biggest of these is
>> that generated code is bloated in various ways. For example, function
>> calls are indirected through the GOT & the t9 register:
>>
>>   8f998064   lw     t9,-32668(gp)
>>   0320f809   jalr   t9
>>
>> Without -fpic the call is simply:
>>
>>   0f803f01   jal    be00fc04 <puts>
>>
>> This is more compact & faster (due to the lack of the load & the
>> dependency the jump has on its result). It is also easier to read &
>> debug because the disassembly shows what function is being called,
>> rather than just an offset from gp which would then have to be looked up
>> in the ELF to discover the target function.
>>
>> Another disadvantage of -fpic is that each function begins with a
>> sequence to calculate the value of the gp register, for example:
>>
>>   3c1c0004   lui    gp,0x4
>>   279c3384   addiu  gp,gp,13188
>>   0399e021   addu   gp,gp,t9
>>
>> Without using -fpic this sequence no longer appears at the start of each
>> function, reducing code size considerably.
>>
>> This patch switches U-Boot from building with -fpic to building with
>> -fno-pic, in order to gain the benefits described above. The cost of
>> this is an extra step during the build process to extract relocation
>> data from the ELF & write it into a new .rel section in a compact
>> format, plus the added complexity of dealing with multiple types of
>> relocation rather than the single type that applied to the GOT. The
>> benefit is smaller, cleaner, more debuggable code. The relocate_code()
>> function is reimplemented in C to handle the new relocation scheme,
>> which also makes it easier to read & debug.
>>
>> Taking maltael_defconfig as an example the size of u-boot.bin built
>> using the Codescape MIPS 2016.05-06 toolchain (gcc 4.9.2, binutils
>> 2.24.90) shrinks from 254KiB to 224KiB.
>>
>> Signed-off-by: Paul Burton <paul.burton at imgtec.com>
>> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
>> Cc: u-boot at lists.denx.de
>>
>> ---
>>
>> Changes in v3:
>> - Fix R_MIPS_26 case that was breaking qemu_mips_defconfig.
>>
>> Changes in v2:
>> - Drop unused .$@.relocs from Makefile.postlink.
>> - Remove PF_OBJCOPY & assign to OBJCOPYFLAGS directly in config.mk.
>> - Move declaration of __rel_start to asm/sections.h.
>>
>>  arch/mips/Makefile.postlink      |  23 +++
>>  arch/mips/config.mk              |  21 +-
>>  arch/mips/cpu/start.S            | 130 ------------
>>  arch/mips/cpu/u-boot.lds         |  41 +---
>>  arch/mips/include/asm/relocs.h   |  24 +++
>>  arch/mips/include/asm/sections.h |   7 +
>>  arch/mips/lib/Makefile           |   1 +
>>  arch/mips/lib/reloc.c            | 164 +++++++++++++++
>>  common/board_f.c                 |   2 +-
>>  tools/.gitignore                 |   1 +
>>  tools/Makefile                   |   2 +
>>  tools/mips-relocs.c              | 426 +++++++++++++++++++++++++++++++++++++++
>>  12 files changed, 663 insertions(+), 179 deletions(-)
>>  create mode 100644 arch/mips/Makefile.postlink
>>  create mode 100644 arch/mips/include/asm/relocs.h
>>  create mode 100644 arch/mips/lib/reloc.c
>>  create mode 100644 tools/mips-relocs.c
>>
> Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
> Tested-by: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
> 
> 
> applied to u-boot-mips/next, thanks.
> 
> 
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
> 


More information about the U-Boot mailing list