From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Tue, 05 Oct 2010 09:40:21 +0200 Subject: [U-Boot] [RFC] [PATCH V2] arm: arm926ejs: use ELF relocations In-Reply-To: <1286260287-1571-1-git-send-email-albert.aribaud@free.fr> References: <1286260287-1571-1-git-send-email-albert.aribaud@free.fr> Message-ID: <4CAAD665.5090500@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Albert, Albert Aribaud wrote: > HISTORY: > > V1 Initial patch > V2 Rebased on latest mainline master > > 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. > > The basic idea of this patch is to replace the -fPIC compile-time > option with the -pie link-time option. This removes the GOT but adds > the .rel.dyn and .dynsym tables, which together allow fixing up code > more completely than with -fPIC and the GOT; for instance, all pointers > inside structures are fixed up with -pie, whereas they are not with GOT. > > Note that references to linker-file-generated symbols were also made > relative to _start rather than absolute. This is not needed as such, > but it will be useful when optimizing the relocation tables. Actually > I should have separated this from the ELF relocation support per se. > > The edminiv2.h config file is there for reference only; this is the > one I used for tests. Latest numbers are: > > 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 > > The size difference is essentially due to .rel.dyn not being optimal. > As discussed, an added build step should allow reducing it by half and > making ELF sizes roughly similar to GOT ones. > > Tests and comments not only welcome but also heartily called for. Tested based on your patch on the magnesium board (ARM926ejs and boots from NOR Flash). U-Boot works, with the following patch: ! I had to set TEXT_BASE to 0xc0000000 as u-boot starts from there, a TEXT_BASE = 0 didn;t work for me! diff --git a/board/logicpd/imx27lite/config.mk b/board/logicpd/imx27lite/config.mk index 2f9c4e6..af1c82b 100644 --- a/board/logicpd/imx27lite/config.mk +++ b/board/logicpd/imx27lite/config.mk @@ -1 +1,4 @@ +# with relocation TEXT_BASE can be anything, and making it 0 +# makes relative and absolute relocation fixups interchangeable. +#TEXT_BASE = 0 TEXT_BASE = 0xc0000000 diff --git a/include/configs/imx27lite-common.h b/include/configs/imx27lite-common.h index 812e5f2..58f3c49 100644 --- a/include/configs/imx27lite-common.h +++ b/include/configs/imx27lite-common.h @@ -236,7 +236,8 @@ "mtdparts=" MTDPARTS_DEFAULT "\0" \ /* additions for new relocation code, must added to all boards */ -#undef CONFIG_SYS_ARM_WITHOUT_RELOC /* This board is tested with relocation support */ +#define CONFIG_RELOC_FIXUP_WORKS +#undef CONFIG_SYS_ARM_WITHOUT_RELOC #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - /* Fix this */ \ CONFIG_SYS_GBL_DATA_SIZE) -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany