public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
@ 2010-10-04 22:01 Albert Aribaud
  2010-10-04 22:09 ` Albert ARIBAUD
                   ` (3 more replies)
  0 siblings, 4 replies; 23+ messages in thread
From: Albert Aribaud @ 2010-10-04 22:01 UTC (permalink / raw)
  To: u-boot

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.

Amicalement,
Albert.

---
 arch/arm/config.mk                |    3 +-
 arch/arm/cpu/arm926ejs/start.S    |  172 +++++++++++++++++++++----------------
 arch/arm/cpu/arm926ejs/u-boot.lds |    9 ++
 arch/arm/include/asm/u-boot-arm.h |   14 ++--
 arch/arm/lib/board.c              |    8 +-
 board/LaCie/edminiv2/config.mk    |    5 +-
 include/configs/edminiv2.h        |    1 +
 7 files changed, 123 insertions(+), 89 deletions(-)

diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index 6923f6d..e9e02da 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -35,7 +35,7 @@ endif
 
 ifndef CONFIG_SYS_ARM_WITHOUT_RELOC
 # needed for relocation
-PLATFORM_RELFLAGS += -fPIC
+#PLATFORM_RELFLAGS += -fPIC
 endif
 
 ifdef CONFIG_SYS_ARM_WITHOUT_RELOC
@@ -72,3 +72,4 @@ PLATFORM_LIBS += $(OBJTREE)/arch/arm/lib/eabi_compat.o
 endif
 endif
 LDSCRIPT := $(SRCTREE)/$(CPUDIR)/u-boot.lds
+PLATFORM_LDFLAGS += -pie
\ No newline at end of file
diff --git a/arch/arm/cpu/arm926ejs/start.S b/arch/arm/cpu/arm926ejs/start.S
index 16ee972..5a7ae7e 100644
--- a/arch/arm/cpu/arm926ejs/start.S
+++ b/arch/arm/cpu/arm926ejs/start.S
@@ -10,6 +10,7 @@
  *  Copyright (c) 2002	Gary Jennejohn <garyj@denx.de>
  *  Copyright (c) 2003	Richard Woodruff <r-woodruff2@ti.com>
  *  Copyright (c) 2003	Kshitij <kshitij@ti.com>
+ *  Copyright (c) 2010	Albert Aribaud <albert.aribaud@free.fr>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -118,22 +119,19 @@ _fiq:
 _TEXT_BASE:
 	.word	TEXT_BASE
 
-#if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
-.globl _armboot_start
-_armboot_start:
-	.word _start
-#endif
-
 /*
  * These are defined in the board-specific linker script.
+ * Subtracting _start from them lets the linker put their
+ * relative position in the executable instead of leaving
+ * them null.
  */
-.globl _bss_start
-_bss_start:
-	.word __bss_start
+.globl _bss_start_ofs
+_bss_start_ofs:
+	.word __bss_start - _start
 
-.globl _bss_end
-_bss_end:
-	.word _end
+.globl _bss_end_ofs
+_bss_end_ofs:
+	.word _end - _start
 
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
@@ -153,29 +151,21 @@ FIQ_STACK_START:
 IRQ_STACK_START_IN:
 	.word	0x0badc0de
 
-.globl _datarel_start
-_datarel_start:
-	.word __datarel_start
-
-.globl _datarelrolocal_start
-_datarelrolocal_start:
-	.word __datarelrolocal_start
-
-.globl _datarellocal_start
-_datarellocal_start:
-	.word __datarellocal_start
+.globl _datarel_start_ofs
+_datarel_start_ofs:
+	.word __datarel_start - _start
 
-.globl _datarelro_start
-_datarelro_start:
-	.word __datarelro_start
+.globl _datarelrolocal_start_ofs
+_datarelrolocal_start_ofs:
+	.word __datarelrolocal_start - _start
 
-.globl _got_start
-_got_start:
-	.word __got_start
+.globl _datarellocal_start_ofs
+_datarellocal_start_ofs:
+	.word __datarellocal_start - _start
 
-.globl _got_end
-_got_end:
-	.word __got_end
+.globl _datarelro_start_ofs
+_datarelro_start_ofs:
+	.word __datarelro_start - _start
 
 /*
  * the actual reset code
@@ -226,9 +216,8 @@ stack_setup:
 
 	adr	r0, _start
 	ldr	r2, _TEXT_BASE
-	ldr	r3, _bss_start
-	sub	r2, r3, r2		/* r2 <- size of armboot	    */
-	add	r2, r0, r2		/* r2 <- source end address	    */
+	ldr	r3, _bss_start_ofs
+	add	r2, r0, r3		/* r2 <- source end address	    */
 	cmp	r0, r6
 	beq	clear_bss
 
@@ -240,36 +229,54 @@ copy_loop:
 	ble	copy_loop
 
 #ifndef CONFIG_PRELOADER
-	/* fix got entries */
-	ldr	r1, _TEXT_BASE		/* Text base */
-	mov	r0, r7			/* reloc addr */
-	ldr	r2, _got_start		/* addr in Flash */
-	ldr	r3, _got_end		/* addr in Flash */
-	sub	r3, r3, r1
-	add	r3, r3, r0
-	sub	r2, r2, r1
-	add	r2, r2, r0
-
+	/*
+	 * fix .rel.dyn relocations
+	 */
+	ldr	r0, _TEXT_BASE		/* r0 <- Text base */
+	sub	r9, r7, r0		/* r9 <- relocation offset */
+	ldr	r10, _dynsym_start_ofs	/* r10 <- sym table ofs */
+	add	r10, r10, r0		/* r10 <- sym table in FLASH */
+	ldr	r2, _rel_dyn_start_ofs	/* r2 <- rel dyn start ofs */
+	add	r2, r2, r0		/* r2 <- rel dyn start in FLASH */
+	ldr	r3, _rel_dyn_end_ofs	/* r3 <- rel dyn end ofs */
+	add	r3, r3, r0		/* r3 <- rel dyn end in FLASH */
 fixloop:
-	ldr	r4, [r2]
-	sub	r4, r4, r1
-	add	r4, r4, r0
-	str	r4, [r2]
-	add	r2, r2, #4
+	ldr	r0, [r2]	/* r0 <- location to fix up, IN FLASH! */
+	add	r0, r9		/* r0 <- location to fix up in RAM */
+	ldr	r1, [r2, #4]
+	and	r8, r1, #0xff
+	cmp	r8, #23		/* relative fixup? */
+	beq	fixrel
+	cmp	r8, #2		/* absolute fixup? */
+	beq	fixabs
+	/* ignore unknown type of fixup */
+	b	fixnext
+fixabs:
+	/* absolute fix: set location to (offset) symbol value */
+	mov	r1, r1, LSR #4		/* r1 <- symbol index in .dynsym */
+	add	r1, r10, r1		/* r1 <- address of symbol in table */
+	ldr	r1, [r1, #4]		/* r1 <- symbol value */
+	add	r1, r9			/* r1 <- relocated sym addr */
+	b	fixnext
+fixrel:
+	/* relative fix: increase location by offset */
+	ldr	r1, [r0]
+	add	r1, r1, r9
+fixnext:
+	str	r1, [r0]
+	add	r2, r2, #8	/* each rel.dyn entry is 8 bytes */
 	cmp	r2, r3
-	bne	fixloop
+	ble	fixloop
 #endif
 #endif	/* #ifndef CONFIG_SKIP_RELOCATE_UBOOT */
 
 clear_bss:
 #ifndef CONFIG_PRELOADER
-	ldr	r0, _bss_start
-	ldr	r1, _bss_end
+	ldr	r0, _bss_start_ofs
+	ldr	r1, _bss_end_ofs
 	ldr	r3, _TEXT_BASE		/* Text base */
 	mov	r4, r7			/* reloc addr */
-	sub	r0, r0, r3
 	add	r0, r0, r4
-	sub	r1, r1, r3
 	add	r1, r1, r4
 	mov	r2, #0x00000000		/* clear			    */
 
@@ -287,24 +294,33 @@ clbss_l:str	r2, [r0]		/* clear loop...		    */
  * initialization, now running from RAM.
  */
 #ifdef CONFIG_NAND_SPL
-	ldr     pc, _nand_boot
-
-_nand_boot: .word nand_boot
+	ldr     r0, _nand_boot_ofs
+	adr	r1, _start
+	add	pc, r0, r1
+_nand_boot_ofs
+	: .word nand_boot - _start
 #else
-	ldr	r0, _TEXT_BASE
-	ldr	r2, _board_init_r
-	sub	r2, r2, r0
-	add	r2, r2, r7	/* position from board_init_r in RAM */
+	ldr	r0, _board_init_r_ofs
+	adr	r1, _start
+	add	r0, r0, r1
+	add	lr, r0, r9
 	/* setup parameters for board_init_r */
 	mov	r0, r5		/* gd_t */
 	mov	r1, r7		/* dest_addr */
 	/* jump to it ... */
-	mov	lr, r2
 	mov	pc, lr
 
-_board_init_r: .word board_init_r
+_board_init_r_ofs:
+	.word board_init_r - _start
 #endif
 
+_rel_dyn_start_ofs:
+	.word __rel_dyn_start - _start
+_rel_dyn_end_ofs:
+	.word __rel_dyn_end - _start
+_dynsym_start_ofs:
+	.word __dynsym_start - _start
+
 #else /* #if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC) */
 /*
  * the actual reset code
@@ -333,10 +349,8 @@ relocate:				/* relocate U-Boot to RAM	    */
 	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
 	cmp     r0, r1                  /* don't reloc during debug         */
 	beq     stack_setup
-	ldr	r2, _armboot_start
-	ldr	r3, _bss_start
-	sub	r2, r3, r2		/* r2 <- size of armboot            */
-	add	r2, r0, r2		/* r2 <- source end address         */
+	ldr	r3, _bss_start_ofs	/* r3 <- _bss_start - _start	    */
+	add	r2, r0, r3		/* r2 <- source end address         */
 
 copy_loop:
 	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
@@ -360,8 +374,11 @@ stack_setup:
 	bic	sp, sp, #7		/* 8-byte alignment for ABI compliance */
 
 clear_bss:
-	ldr	r0, _bss_start		/* find start of bss segment        */
-	ldr	r1, _bss_end		/* stop here                        */
+	adr	r2, _start
+	ldr	r0, _bss_start_ofs	/* find start of bss segment        */
+	add	r0, r0, r2
+	ldr	r1, _bss_end_ofs	/* stop here                        */
+	add	r1, r1, r2
 	mov	r2, #0x00000000		/* clear                            */
 
 #ifndef CONFIG_PRELOADER
@@ -374,13 +391,16 @@ clbss_l:str	r2, [r0]		/* clear loop...                    */
 	bl red_LED_on
 #endif /* CONFIG_PRELOADER */
 
-	ldr	pc, _start_armboot
+	ldr	r0, _start_armboot_ofs
+	adr	r1, _start
+	add	r0, r0, r1
+	ldr	pc, r0
 
-_start_armboot:
+_start_armboot_ofs:
 #ifdef CONFIG_NAND_SPL
-	.word nand_boot
+	.word nand_boot - _start
 #else
-	.word start_armboot
+	.word start_armboot - _start
 #endif /* CONFIG_NAND_SPL */
 #endif /* #if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC) */
 
@@ -469,7 +489,7 @@ cpu_init_crit:
 	sub	sp, sp, #S_FRAME_SIZE
 	stmia	sp, {r0 - r12}	@ Save user registers (now in svc mode) r0-r12
 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
-	ldr	r2, _armboot_start
+	adr	r2, _start
 	sub	r2, r2, #(CONFIG_STACKSIZE+CONFIG_SYS_MALLOC_LEN)
 	sub	r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
 #else
@@ -507,7 +527,7 @@ cpu_init_crit:
 
 	.macro get_bad_stack
 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
-	ldr	r13, _armboot_start		@ setup our mode stack
+	adr	r13, _start		@ setup our mode stack
 	sub	r13, r13, #(CONFIG_STACKSIZE+CONFIG_SYS_MALLOC_LEN)
 	sub	r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack
 #else
diff --git a/arch/arm/cpu/arm926ejs/u-boot.lds b/arch/arm/cpu/arm926ejs/u-boot.lds
index 02eb8ca..f07a54a 100644
--- a/arch/arm/cpu/arm926ejs/u-boot.lds
+++ b/arch/arm/cpu/arm926ejs/u-boot.lds
@@ -51,6 +51,14 @@ SECTIONS
 		*(.data.rel.ro)
 	}
 
+	. = ALIGN(4);
+	__rel_dyn_start = .;
+	.rel.dyn : { *(.rel.dyn) }
+	__rel_dyn_end = .;
+
+	__dynsym_start = .;
+	.dynsym : { *(.dynsym) }
+
 	__got_start = .;
 	. = ALIGN(4);
 	.got : { *(.got) }
@@ -65,4 +73,5 @@ SECTIONS
 	__bss_start = .;
 	.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
 	_end = .;
+	
 }
diff --git a/arch/arm/include/asm/u-boot-arm.h b/arch/arm/include/asm/u-boot-arm.h
index faf800a..4ac4f61 100644
--- a/arch/arm/include/asm/u-boot-arm.h
+++ b/arch/arm/include/asm/u-boot-arm.h
@@ -30,18 +30,18 @@
 #define _U_BOOT_ARM_H_	1
 
 /* for the following variables, see start.S */
-extern ulong _bss_start;	/* code + data end == BSS start */
-extern ulong _bss_end;		/* BSS end */
+extern ulong _bss_start_ofs;	/* BSS start relative to _start */
+extern ulong _bss_end_ofs;		/* BSS end relative to _start */
 extern ulong IRQ_STACK_START;	/* top of IRQ stack */
 extern ulong FIQ_STACK_START;	/* top of FIQ stack */
 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
-extern ulong _armboot_start;	/* code start */
+extern ulong _armboot_start_ofs;	/* code start */
 #else
 extern ulong _TEXT_BASE;	/* code start */
-extern ulong _datarel_start;
-extern ulong _datarelrolocal_start;
-extern ulong _datarellocal_start;
-extern ulong _datarelro_start;
+extern ulong _datarel_start_ofs;
+extern ulong _datarelrolocal_start_ofs;
+extern ulong _datarellocal_start_ofs;
+extern ulong _datarelro_start_ofs;
 extern ulong IRQ_STACK_START_IN;	/* 8 bytes in IRQ stack */
 #endif
 
diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index 5f2dfd0..e411d93 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -147,7 +147,7 @@ static int display_banner (void)
 #else
 	       _armboot_start,
 #endif
-	       _bss_start, _bss_end);
+	       _bss_start_ofs+_TEXT_BASE, _bss_end_ofs+_TEXT_BASE);
 #ifdef CONFIG_MODEM_SUPPORT
 	debug ("Modem Support enabled\n");
 #endif
@@ -517,7 +517,7 @@ void board_init_f (ulong bootflag)
 
 	memset ((void*)gd, 0, sizeof (gd_t));
 
-	gd->mon_len = _bss_end - _TEXT_BASE;
+	gd->mon_len = _bss_end_ofs;
 
 	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
 		if ((*init_fnc_ptr)() != 0) {
@@ -679,6 +679,7 @@ static char *failed = "*** failed ***\n";
  *
  ************************************************************************
  */
+
 void board_init_r (gd_t *id, ulong dest_addr)
 {
 	char *s;
@@ -702,7 +703,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
 
 	gd->flags |= GD_FLG_RELOC;	/* tell others: relocation done */
 
-	monitor_flash_len = _bss_start - _TEXT_BASE;
+	monitor_flash_len = _bss_start_ofs;
 	debug ("monitor flash len: %08lX\n", monitor_flash_len);
 	board_init();	/* Setup chipselects */
 
@@ -914,6 +915,7 @@ extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
 
 	/* NOTREACHED - no way out of command loop except booting */
 }
+
 #endif /* defined(CONFIG_SYS_ARM_WITHOUT_RELOC) */
 
 void hang (void)
diff --git a/board/LaCie/edminiv2/config.mk b/board/LaCie/edminiv2/config.mk
index bb444b5..f8bdc3a 100644
--- a/board/LaCie/edminiv2/config.mk
+++ b/board/LaCie/edminiv2/config.mk
@@ -24,5 +24,6 @@
 # MA 02110-1301 USA
 #
 
-# with relocation TEXT_BASE now *must* be in FLASH
-TEXT_BASE = 0xfff90000
+# with relocation TEXT_BASE can be anything, and making it 0
+# makes relative and absolute relocation fixups interchangeable.
+TEXT_BASE = 0
diff --git a/include/configs/edminiv2.h b/include/configs/edminiv2.h
index e6537fc..8bcdfcc 100644
--- a/include/configs/edminiv2.h
+++ b/include/configs/edminiv2.h
@@ -224,6 +224,7 @@
 #define CONFIG_SYS_MAXARGS		16
 
 /* additions for new relocation code, must be added to all boards */
+#define CONFIG_RELOC_FIXUP_WORKS
 #undef CONFIG_SYS_ARM_WITHOUT_RELOC
 #define CONFIG_SYS_SDRAM_BASE		0
 #define CONFIG_SYS_INIT_SP_ADDR	\
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:01 Albert Aribaud
@ 2010-10-04 22:09 ` Albert ARIBAUD
  2010-10-04 23:57   ` John Rigby
  2010-10-05  5:30   ` Wolfgang Denk
  2010-10-04 22:22 ` Graeme Russ
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-04 22:09 UTC (permalink / raw)
  To: u-boot

Afterthought: I have not explained how to test this patch.

If your board is based on arm926ejs and does not have its own 
u-boot.lds, then you can simply applly the patch and modify your board 
config file as I modified edminiv2.h, basically by adding the config 
option CONFIG_RELOC_FIXUP_WORKS which will remove all calls to manual 
fixup code.

If your board is arm926ejs but has its own start.S or u-boot.lds (or 
both) then you'll also have to apply them the changes I made to their 
arm926 counterparts.

Ditto if your board is ARM but not arm926.

You should then be able to build and run.

Remember: this patch only applies to boards which boot from NOR FLASH! 
You can test it on other types of boards (NAND-based, etc) for 
regression testing, but nothing more.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:01 Albert Aribaud
  2010-10-04 22:09 ` Albert ARIBAUD
@ 2010-10-04 22:22 ` Graeme Russ
  2010-10-04 22:57   ` Albert ARIBAUD
  2010-10-04 23:23 ` Graeme Russ
  2010-10-05  6:11 ` Wolfgang Denk
  3 siblings, 1 reply; 23+ messages in thread
From: Graeme Russ @ 2010-10-04 22:22 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud <albert.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?

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

Regards,

Graeme

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:22 ` Graeme Russ
@ 2010-10-04 22:57   ` Albert ARIBAUD
  2010-10-04 23:21     ` Graeme Russ
  0 siblings, 1 reply; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-04 22:57 UTC (permalink / raw)
  To: u-boot

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:57   ` Albert ARIBAUD
@ 2010-10-04 23:21     ` Graeme Russ
  2010-10-05  0:16       ` Albert ARIBAUD
  0 siblings, 1 reply; 23+ messages in thread
From: Graeme Russ @ 2010-10-04 23:21 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 5, 2010 at 9:57 AM, Albert ARIBAUD <albert.aribaud@free.fr> wrote:
> Le 05/10/2010 00:22, Graeme Russ a ?crit :
>>
>> On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud<albert.aribaud@free.fr>
>>  wrote:
>>>

> 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.

It would be interesting to compare against the basline non-relocatable
version

>
> - 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.

I now discard a few sections:

	/DISCARD/ : { *(.dynstr*) }
	/DISCARD/ : { *(.dynamic*) }
	/DISCARD/ : { *(.plt*) }
	/DISCARD/ : { *(.interp*) }
	/DISCARD/ : { *(.gnu*) }

Not that it makes a huge difference - most of these are trivially small

>
> 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.
>

Which is not copied to RAM, so not as nasty as the .got related increase

I'm also looking at moving the low-level intialisation and relocation code
into a seperate section (outside .text) so I even less to relocate to RAM

Then I could even compress the relocatable section, but that is just being
silly ;)

Regards,

Graeme

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:01 Albert Aribaud
  2010-10-04 22:09 ` Albert ARIBAUD
  2010-10-04 22:22 ` Graeme Russ
@ 2010-10-04 23:23 ` Graeme Russ
  2010-10-04 23:59   ` Albert ARIBAUD
  2010-10-05  6:11 ` Wolfgang Denk
  3 siblings, 1 reply; 23+ messages in thread
From: Graeme Russ @ 2010-10-04 23:23 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud <albert.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.
>
> 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.
>

So does this make all of Heiko's ARM relocation patches redundant?

Regards,

Graeme

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:09 ` Albert ARIBAUD
@ 2010-10-04 23:57   ` John Rigby
  2010-10-05  0:01     ` Graeme Russ
  2010-10-05  5:30   ` Wolfgang Denk
  1 sibling, 1 reply; 23+ messages in thread
From: John Rigby @ 2010-10-04 23:57 UTC (permalink / raw)
  To: u-boot

On Mon, Oct 4, 2010 at 4:09 PM, Albert ARIBAUD <albert.aribaud@free.fr> wrote:
....
>
> Remember: this patch only applies to boards which boot from NOR FLASH!
> You can test it on other types of boards (NAND-based, etc) for
> regression testing, but nothing more.

Dumb question, how is the case of a NAND SPL, or similar loader
loading u-boot first to a low RAM address then u-boot relocating
itself to top of RAM different than u-boot relocating itself from NOR
to top of RAM?

Thanks,
John

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 23:23 ` Graeme Russ
@ 2010-10-04 23:59   ` Albert ARIBAUD
  0 siblings, 0 replies; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-04 23:59 UTC (permalink / raw)
  To: u-boot

Le 05/10/2010 01:23, Graeme Russ a ?crit :
> So does this make all of Heiko's ARM relocation patches redundant?

Yes, it does, I'm afraid.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 23:57   ` John Rigby
@ 2010-10-05  0:01     ` Graeme Russ
  2010-10-05  5:34       ` Wolfgang Denk
  0 siblings, 1 reply; 23+ messages in thread
From: Graeme Russ @ 2010-10-05  0:01 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 5, 2010 at 10:57 AM, John Rigby <john.rigby@linaro.org> wrote:
> On Mon, Oct 4, 2010 at 4:09 PM, Albert ARIBAUD <albert.aribaud@free.fr> wrote:
> ....
>>
>> Remember: this patch only applies to boards which boot from NOR FLASH!
>> You can test it on other types of boards (NAND-based, etc) for
>> regression testing, but nothing more.
>
> Dumb question, how is the case of a NAND SPL, or similar loader
> loading u-boot first to a low RAM address then u-boot relocating
> itself to top of RAM different than u-boot relocating itself from NOR
> to top of RAM?
>

Can NAND SPL initialise and size memory before loading U-Boot into RAM?
If so, could the relocation code be added to NAND SPL so only one copy
operation is performed?

Regards,

Graeme

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 23:21     ` Graeme Russ
@ 2010-10-05  0:16       ` Albert ARIBAUD
  2010-10-05  3:42         ` J. William Campbell
  0 siblings, 1 reply; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-05  0:16 UTC (permalink / raw)
  To: u-boot

Le 05/10/2010 01:21, Graeme Russ a ?crit :
> On Tue, Oct 5, 2010 at 9:57 AM, Albert ARIBAUD<albert.aribaud@free.fr>  wrote:
>> Le 05/10/2010 00:22, Graeme Russ a ?crit :
>>>
>>> On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud<albert.aribaud@free.fr>
>>>   wrote:
>>>>
>
>> 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.
>
> It would be interesting to compare against the basline non-relocatable
> version

I #defined CONFIG_RELOC_FIXUP_WORKS and removed -pie from the ARM 
config.mk. This puts the edminiv2 code in the non-reloc build case, and 
produces identical .text and .data, and almost identical .rodata, as the 
ELF case.

>> - 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.
>
> I now discard a few sections:
>
> 	/DISCARD/ : { *(.dynstr*) }
> 	/DISCARD/ : { *(.dynamic*) }
> 	/DISCARD/ : { *(.plt*) }
> 	/DISCARD/ : { *(.interp*) }
> 	/DISCARD/ : { *(.gnu*) }
>
> Not that it makes a huge difference - most of these are trivially small

Thanks. I'll add this to the .lds as a measure of clarity.

>> 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.
>
> Which is not copied to RAM, so not as nasty as the .got related increase

True also. Note that we could probably shrink the table to 1/4 of its 
current size by taking advantage from the fact that the few 
non-program-base-relative relocations it has can easily be converted to 
program-base-relative, and that two consecutive relocations are always 
less than 64 KB away from each other. Of course that moves away from 
using the ELF structures as-is, and requires additional build steps, but 
people with small FLASH devices may want it.

> I'm also looking at moving the low-level intialisation and relocation code
> into a seperate section (outside .text) so I even less to relocate to RAM

As Wolfgang pointed out, there might be issues in that all the code that 
runs in FLASH should be truly PI, which might not be a piece of cake. 
ARM C code, for instance, tends to generate literals which need to be 
relocated if you don't run the code where it was linked for.

> Then I could even compress the relocatable section, but that is just being
> silly ;)

:)

> Regards,
>
> Graeme

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  0:16       ` Albert ARIBAUD
@ 2010-10-05  3:42         ` J. William Campbell
  0 siblings, 0 replies; 23+ messages in thread
From: J. William Campbell @ 2010-10-05  3:42 UTC (permalink / raw)
  To: u-boot

  On 10/4/2010 5:16 PM, Albert ARIBAUD wrote:
> Le 05/10/2010 01:21, Graeme Russ a ?crit :
>> On Tue, Oct 5, 2010 at 9:57 AM, Albert ARIBAUD<albert.aribaud@free.fr>   wrote:
>>> Le 05/10/2010 00:22, Graeme Russ a ?crit :
>>>> On Tue, Oct 5, 2010 at 9:01 AM, Albert Aribaud<albert.aribaud@free.fr>
>>>>    wrote:
>>> 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.
>> It would be interesting to compare against the basline non-relocatable
>> version
> I #defined CONFIG_RELOC_FIXUP_WORKS and removed -pie from the ARM
> config.mk. This puts the edminiv2 code in the non-reloc build case, and
> produces identical .text and .data, and almost identical .rodata, as the
> ELF case.
>
>>> - 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.
>> I now discard a few sections:
>>
>> 	/DISCARD/ : { *(.dynstr*) }
>> 	/DISCARD/ : { *(.dynamic*) }
>> 	/DISCARD/ : { *(.plt*) }
>> 	/DISCARD/ : { *(.interp*) }
>> 	/DISCARD/ : { *(.gnu*) }
>>
>> Not that it makes a huge difference - most of these are trivially small
> Thanks. I'll add this to the .lds as a measure of clarity.
>
>>> 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.
>> Which is not copied to RAM, so not as nasty as the .got related increase
> True also. Note that we could probably shrink the table to 1/4 of its
> current size by taking advantage from the fact that the few
> non-program-base-relative relocations it has can easily be converted to
> program-base-relative, and that two consecutive relocations are always
> less than 64 KB away from each other. Of course that moves away from
> using the ELF structures as-is, and requires additional build steps, but
> people with small FLASH devices may want it.
Hi All,
      This may be pushing it in the more general case. ARM has only a 
few relocation types. Other CPU types have more types, and therefore 
still may need a type field. You can certainly get 1/2 in all cases, and 
more if you are willing to get a bit more complex in the preprocessing. 
That said, I think this is best left to later when all CPUs are in the 
relocatable state.
>> I'm also looking at moving the low-level intialisation and relocation code
>> into a seperate section (outside .text) so I even less to relocate to RAM
> As Wolfgang pointed out, there might be issues in that all the code that
> runs in FLASH should be truly PI, which might not be a piece of cake.
> ARM C code, for instance, tends to generate literals which need to be
> relocated if you don't run the code where it was linked for.
True, but the code WILL be running at the address it was linked for. It 
just won't be copied and relocated to the "new" address, as it would 
never be run again anyway. This goal is along the lines of the "two 
stage u-boot" that has been/is being considered, where all execute only 
once code can be concentrated into a segment that is not moved into ram.

Bill Campbell
>> Then I could even compress the relocatable section, but that is just being
>> silly ;)
> :)
>
>> Regards,
>>
>> Graeme
> Amicalement,

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:09 ` Albert ARIBAUD
  2010-10-04 23:57   ` John Rigby
@ 2010-10-05  5:30   ` Wolfgang Denk
  2010-10-05  5:41     ` J. William Campbell
  2010-10-05  5:47     ` Albert ARIBAUD
  1 sibling, 2 replies; 23+ messages in thread
From: Wolfgang Denk @ 2010-10-05  5:30 UTC (permalink / raw)
  To: u-boot

Dear Albert ARIBAUD,

In message <4CAA50AA.3000608@free.fr> you wrote:
> 
> Remember: this patch only applies to boards which boot from NOR FLASH! 
> You can test it on other types of boards (NAND-based, etc) for 
> regression testing, but nothing more.

Assuming the NAND loder does not load U-Boot to it's final location
at the upper end of RAM, but - say - somewhere in lower memory, the
standard relocation preocess will be running, so I think there should
be no real difference between (such) NAND booting systems and NOR
booting ones - or am I missing something?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
If you use modules, you pay the price. Sane embedded solutions
running in "tight" environments don't use modules :-)
    -- Benjamin Herrenschmidt in <1258234866.2140.451.camel@pasglop>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  0:01     ` Graeme Russ
@ 2010-10-05  5:34       ` Wolfgang Denk
  2010-10-05  5:40         ` Graeme Russ
  0 siblings, 1 reply; 23+ messages in thread
From: Wolfgang Denk @ 2010-10-05  5:34 UTC (permalink / raw)
  To: u-boot

Dear Graeme Russ,

In message <AANLkTikqE0_DEqHs-tX3A4XuEXJhM0CYW_+j6izhmktw@mail.gmail.com> you wrote:
>
> Can NAND SPL initialise and size memory before loading U-Boot into RAM?

It has to. You cannot load into and run from uninitialized RAM ;-)

> If so, could the relocation code be added to NAND SPL so only one copy
> operation is performed?

I'm afraid it cannot, due to size limitations. The NAND loader often
hast to fit into as little a 2 or 4 KiB...

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"Language shapes the way we think, and determines what we  can  think
about."                                                 - B. L. Whorf

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  5:34       ` Wolfgang Denk
@ 2010-10-05  5:40         ` Graeme Russ
  2010-10-05  5:42           ` Graeme Russ
  0 siblings, 1 reply; 23+ messages in thread
From: Graeme Russ @ 2010-10-05  5:40 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 5, 2010 at 4:34 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Graeme Russ,
>
> In message <AANLkTikqE0_DEqHs-tX3A4XuEXJhM0CYW_+j6izhmktw@mail.gmail.com> you wrote:
>>
>> Can NAND SPL initialise and size memory before loading U-Boot into RAM?
>
> It has to. You cannot load into and run from uninitialized RAM ;-)
>
>> If so, could the relocation code be added to NAND SPL so only one copy
>> operation is performed?
>
> I'm afraid it cannot, due to size limitations. The NAND loader often
> hast to fit into as little a 2 or 4 KiB...
>

For x86, the actual relocation calculations can be done in a probably a
few dozen bytes of code. It contains:

 - One offset calculation
 - A single tight loop
 - Two comparisons (probably not needed in the generic case as they are used
   to filter out x86 specific code outside .text)
 - An offset addition

If the only constraint is space then it _may_ be possible in some scenarios
(although I do acknowledge that previous trival changes have caused the
size constaint to be violated)

Regards,

Graeme

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  5:30   ` Wolfgang Denk
@ 2010-10-05  5:41     ` J. William Campbell
  2010-10-05  5:47     ` Albert ARIBAUD
  1 sibling, 0 replies; 23+ messages in thread
From: J. William Campbell @ 2010-10-05  5:41 UTC (permalink / raw)
  To: u-boot

  On 10/4/2010 10:30 PM, Wolfgang Denk wrote:
> Dear Albert ARIBAUD,
>
> In message<4CAA50AA.3000608@free.fr>  you wrote:
>> Remember: this patch only applies to boards which boot from NOR FLASH!
>> You can test it on other types of boards (NAND-based, etc) for
>> regression testing, but nothing more.
> Assuming the NAND loder does not load U-Boot to it's final location
> at the upper end of RAM, but - say - somewhere in lower memory, the
> standard relocation preocess will be running, so I think there should
> be no real difference between (such) NAND booting systems and NOR
> booting ones - or am I missing something?
FWIW I think you are right. If u-boot is linked for the address where 
the NAND loader put it, everything should work fine. It can
size memory, move a copy of u-boot to the top of memory, and branch to 
the entry point that continues initialization.

Bill Campbell
> Best regards,
>
> Wolfgang Denk
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  5:40         ` Graeme Russ
@ 2010-10-05  5:42           ` Graeme Russ
  2010-10-05  6:13             ` Albert ARIBAUD
  0 siblings, 1 reply; 23+ messages in thread
From: Graeme Russ @ 2010-10-05  5:42 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 5, 2010 at 4:40 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> On Tue, Oct 5, 2010 at 4:34 PM, Wolfgang Denk <wd@denx.de> wrote:
>> Dear Graeme Russ,
>>
>> In message <AANLkTikqE0_DEqHs-tX3A4XuEXJhM0CYW_+j6izhmktw@mail.gmail.com> you wrote:
>>>
>>> Can NAND SPL initialise and size memory before loading U-Boot into RAM?
>>
>> It has to. You cannot load into and run from uninitialized RAM ;-)
>>
>>> If so, could the relocation code be added to NAND SPL so only one copy
>>> operation is performed?
>>
>> I'm afraid it cannot, due to size limitations. The NAND loader often
>> hast to fit into as little a 2 or 4 KiB...
>>
>
> For x86, the actual relocation calculations can be done in a probably a
> few dozen bytes of code. It contains:
>
>  - One offset calculation
>  - A single tight loop
>  - Two comparisons (probably not needed in the generic case as they are used
>   to filter out x86 specific code outside .text)
>  - An offset addition
>
> If the only constraint is space then it _may_ be possible in some scenarios
> (although I do acknowledge that previous trival changes have caused the
> size constaint to be violated)
>

Another alternative is to load into upper memory and have the relocation
code detect that U-Boot is already there and skip the copy operation

Regards,

Graeme

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  5:30   ` Wolfgang Denk
  2010-10-05  5:41     ` J. William Campbell
@ 2010-10-05  5:47     ` Albert ARIBAUD
  1 sibling, 0 replies; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-05  5:47 UTC (permalink / raw)
  To: u-boot

Le 05/10/2010 07:30, Wolfgang Denk a ?crit :
> Dear Albert ARIBAUD,
>
> In message<4CAA50AA.3000608@free.fr>  you wrote:
>>
>> Remember: this patch only applies to boards which boot from NOR FLASH!
>> You can test it on other types of boards (NAND-based, etc) for
>> regression testing, but nothing more.
>
> Assuming the NAND loder does not load U-Boot to it's final location
> at the upper end of RAM, but - say - somewhere in lower memory, the
> standard relocation preocess will be running, so I think there should
> be no real difference between (such) NAND booting systems and NOR
> booting ones - or am I missing something?

No, you're not; instead of "but [you can test] nothing more", I should 
have written "but don't expect much more" -- NAND testers may find it 
works because yes, relocation does not differ whether from FLASH or from 
RAM; however I did nothing to make sure NAND booting (and other similar 
methods) works, whereas I spent quite some time to make NOR boot work.

> Best regards,
>
> Wolfgang Denk

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-04 22:01 Albert Aribaud
                   ` (2 preceding siblings ...)
  2010-10-04 23:23 ` Graeme Russ
@ 2010-10-05  6:11 ` Wolfgang Denk
  3 siblings, 0 replies; 23+ messages in thread
From: Wolfgang Denk @ 2010-10-05  6:11 UTC (permalink / raw)
  To: u-boot

Dear Albert Aribaud,

In message <1286229705-16019-1-git-send-email-albert.aribaud@free.fr> you wrote:
> This patch is *not* a submission for master!

I'm trying this on arm1136 (i.MX31) at the moment. It seems the patch
was not taken against latest mainline, but probably against a previous
state in your local tree.

I get:

	Configuring for qong board...
	arch/arm/lib/libarm.a(board.o): In function `board_init_r':
	/home/wd/git/u-boot/work/arch/arm/lib/board.c:913: undefined reference to `_bss_start_ofs'
	arch/arm/lib/libarm.a(board.o): In function `board_init_f': /home/wd/git/u-boot/work/arch/arm/lib/board.c:664: undefined reference to `_bss_end_ofs'

Seems that entries for _bss_start_ofs and _bss_end_ofs are missing in
my version of the linker script, and I don't see these in your patch
either.

[There are aslo rejects in board/LaCie/edminiv2/config.mk and
include/configs/edminiv2.h, probably d=ue to the same reason.]

Can you please provide an updated patch against mainline? Thanks.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Punishment becomes ineffective after a certain point. Men become  in-
sensitive.
	-- Eneg, "Patterns of Force", stardate 2534.7

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  5:42           ` Graeme Russ
@ 2010-10-05  6:13             ` Albert ARIBAUD
  0 siblings, 0 replies; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-05  6:13 UTC (permalink / raw)
  To: u-boot

Le 05/10/2010 07:42, Graeme Russ a ?crit :
> On Tue, Oct 5, 2010 at 4:40 PM, Graeme Russ<graeme.russ@gmail.com>  wrote:
>> On Tue, Oct 5, 2010 at 4:34 PM, Wolfgang Denk<wd@denx.de>  wrote:
>>> Dear Graeme Russ,
>>>
>>> In message<AANLkTikqE0_DEqHs-tX3A4XuEXJhM0CYW_+j6izhmktw@mail.gmail.com>  you wrote:
>>>>
>>>> Can NAND SPL initialise and size memory before loading U-Boot into RAM?
>>>
>>> It has to. You cannot load into and run from uninitialized RAM ;-)
>>>
>>>> If so, could the relocation code be added to NAND SPL so only one copy
>>>> operation is performed?
>>>
>>> I'm afraid it cannot, due to size limitations. The NAND loader often
>>> hast to fit into as little a 2 or 4 KiB...
>>>
>>
>> For x86, the actual relocation calculations can be done in a probably a
>> few dozen bytes of code. It contains:
>>
>>   - One offset calculation
>>   - A single tight loop
>>   - Two comparisons (probably not needed in the generic case as they are used
>>    to filter out x86 specific code outside .text)
>>   - An offset addition
>>
>> If the only constraint is space then it _may_ be possible in some scenarios
>> (although I do acknowledge that previous trival changes have caused the
>> size constaint to be violated)
>>
>
> Another alternative is to load into upper memory and have the relocation
> code detect that U-Boot is already there and skip the copy operation

The loader would have to know something about the way u-boot relocates 
itself, and this may change based on configuration.

For instance, on ARM, if either icache or dcache are configured, u-boot 
will reserve the upper 64 KB for TLB and thus relocate 64 KB lower than 
if neither icache nor dcache are configured. Ditto for VFD, LCD 
framebuffer, etc. Only after these allocations, and thus below them, is 
u-boot finally relocated.

An independent loader would thus have to figure all this out in order to 
know how exactly where u-boot expects to relocate, otherwise it may put 
u-boot at a location which would be almost, but not quite, entirely 
unlike the intended one -- and that's the worst possible choice, as we 
now hit the dreaded 'relocate over oneself' issue.

OTOH, the u-boot board.c may possibly be modified so that the the final 
location of the u-boot code only depend on its code size, not its 
configuration options. Something like, in descending order: u-boot code, 
data and bss; TLBs, VFDs, framebuffers, etc; malloc arena; and stack.

> Regards,
>
> Graeme

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
@ 2010-10-05  6:13 Wolfgang Denk
  2010-10-05  6:33 ` Albert ARIBAUD
  0 siblings, 1 reply; 23+ messages in thread
From: Wolfgang Denk @ 2010-10-05  6:13 UTC (permalink / raw)
  To: u-boot

Dear Albert Aribaud,

I wrote:

> I get:
> 
> 	Configuring for qong board...
> 	arch/arm/lib/libarm.a(board.o): In function `board_init_r':
> 	/home/wd/git/u-boot/work/arch/arm/lib/board.c:913: undefined reference to `_bss_start_ofs'
> 	arch/arm/lib/libarm.a(board.o): In function `board_init_f': /home/wd/git/u-boot/work/arch/arm/lib/board.c:664: undefined reference to `_bss_end_ofs'
> 
> Seems that entries for _bss_start_ofs and _bss_end_ofs are missing in
> my version of the linker script, and I don't see these in your patch
> either.

Please ignore me. Just found them in your linker script changes.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"It ain't so much the things we don't know that get  us  in  trouble.
It's  the  things  we know that ain't so." - Artemus Ward aka Charles
Farrar Brown

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2010-10-05  6:13 [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations Wolfgang Denk
@ 2010-10-05  6:33 ` Albert ARIBAUD
  0 siblings, 0 replies; 23+ messages in thread
From: Albert ARIBAUD @ 2010-10-05  6:33 UTC (permalink / raw)
  To: u-boot

Le 05/10/2010 08:13, Wolfgang Denk a ?crit :

> Please ignore me. Just found them in your linker script changes.

It remains that my patch did not apply cleanly onto the latest master. I 
sent out a rebased one as V2. Thanks for pointing this out.

> Best regards,
>
> Wolfgang Denk

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot]  [RFC] [PATCH] arm: arm926ejs: use ELF relocations
@ 2011-03-29 23:13 du zhigang
  2011-03-30  5:06 ` Albert ARIBAUD
  0 siblings, 1 reply; 23+ messages in thread
From: du zhigang @ 2011-03-29 23:13 UTC (permalink / raw)
  To: u-boot





dear:

i am using u-boot 2011.03-rc1 compiled by
CS arm-none-eabi-gcc 4.5.1

board at91sam9263ek_norflash_boot_config i
using gdb 6.8.1 debug it

when u-boot compiled? i found an error

?

/dzg/crosstool/4.5.1/bin/.arm-none-eabi-ld:
warning: creating a DT_TEXTREL in object.

?

/dzg/x86/insight-6.8-1/gdb/insight -se
u-boot

BFD:
/dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 37 >= 0 for
section `'

BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot:
invalid string offset 32 >= 0 for section `'

BFD:
/dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 53 >= 0 for
section `'

BFD:
/dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 1 >= 0 for
section `'

BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot:
invalid string offset 20 >= 0 for section `'

BFD:
/dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 82 >= 0 for
section `'

BFD:
/dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 67 >= 0 for
section `'

?

when i set breakpoint such as

b board_init_f it seems to show wrong line
number at line 132

?

i also found this version of u-boot change
board_init_f to run in flash

why dose it? in version 2010.09 it run
after relocated in ram

i found the linker link? init_fnc_t *init_sequence[]

functions with address like 0x23fxxxxx

what does the linker do with -pie option
does it link the functions run in flash with addr like 0xaxxxx?

?

do you test eldk 4.2 compiled with this
board and run in norflash?

?

thanks 

best regards




      

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations
  2011-03-29 23:13 du zhigang
@ 2011-03-30  5:06 ` Albert ARIBAUD
  0 siblings, 0 replies; 23+ messages in thread
From: Albert ARIBAUD @ 2011-03-30  5:06 UTC (permalink / raw)
  To: u-boot

Hi,

(how is this an RFC or PATCH? There is none in this mail)

Le 30/03/2011 01:13, du zhigang a ?crit :
> dear:
>
> i am using u-boot 2011.03-rc1 compiled by CS arm-none-eabi-gcc 4.5.1
>
> board at91sam9263ek_norflash_boot_config i using gdb 6.8.1 debug it
>
> when u-boot compiledi found an error
>
> /dzg/crosstool/4.5.1/bin/.arm-none-eabi-ld: warning: creating a
> DT_TEXTREL in object.
>
> /dzg/x86/insight-6.8-1/gdb/insight -se u-boot
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 37
>  >= 0 for section `'
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 32
>  >= 0 for section `'
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 53
>  >= 0 for section `'
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 1
>  >= 0 for section `'
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 20
>  >= 0 for section `'
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 82
>  >= 0 for section `'
>
> BFD: /dzg/arm/u-boot/u-boot-2011.03-rc1/u-boot: invalid string offset 67
>  >= 0 for section `'
>
> when i set breakpoint such as
>
> b board_init_f it seems to show wrong line number at line 132
>
> i also found this version of u-boot change board_init_f to run in flash
>
> why dose it? in version 2010.09 it run after relocated in ram
>
> i found the linker linkinit_fnc_t *init_sequence[]
>
> functions with address like 0x23fxxxxx

All this is the normal result of ARM relocation introduction, which I 
sense you already know judging from the subject of your post.

> what does the linker do with -pie option does it link the functions run
> in flash with addr like 0xaxxxx?

Not exactly -- a toolchain has no notion of flash vs RAM. The -pie 
option, as the binutil documentation states, produces a relocatable binary.

> do you test eldk 4.2 compiled with this board and run in norflash?

This is formally the board maintainer's work; see MAINTAINERS. However, 
many other ARM boards are tested with ELDK 4.2 or CodeSourcery 2010q1 
for instance.

Note that you can provide patches which the maintainer will just have to 
Ack, as well.

> thanks
>
> best regards

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2011-03-30  5:06 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-05  6:13 [U-Boot] [RFC] [PATCH] arm: arm926ejs: use ELF relocations Wolfgang Denk
2010-10-05  6:33 ` Albert ARIBAUD
  -- strict thread matches above, loose matches on Subject: below --
2011-03-29 23:13 du zhigang
2011-03-30  5:06 ` Albert ARIBAUD
2010-10-04 22:01 Albert Aribaud
2010-10-04 22:09 ` Albert ARIBAUD
2010-10-04 23:57   ` John Rigby
2010-10-05  0:01     ` Graeme Russ
2010-10-05  5:34       ` Wolfgang Denk
2010-10-05  5:40         ` Graeme Russ
2010-10-05  5:42           ` Graeme Russ
2010-10-05  6:13             ` Albert ARIBAUD
2010-10-05  5:30   ` Wolfgang Denk
2010-10-05  5:41     ` J. William Campbell
2010-10-05  5:47     ` Albert ARIBAUD
2010-10-04 22:22 ` Graeme Russ
2010-10-04 22:57   ` Albert ARIBAUD
2010-10-04 23:21     ` Graeme Russ
2010-10-05  0:16       ` Albert ARIBAUD
2010-10-05  3:42         ` J. William Campbell
2010-10-04 23:23 ` Graeme Russ
2010-10-04 23:59   ` Albert ARIBAUD
2010-10-05  6:11 ` Wolfgang Denk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox