[U-Boot] [PATCH v3 2/2] MIPS: Stop building position independent code
Daniel Schwierzeck
daniel.schwierzeck at gmail.com
Fri Jun 23 15:21:20 UTC 2017
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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170623/96e3f109/attachment.sig>
More information about the U-Boot
mailing list