Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations
Le 13/10/2010 07:27, Heiko Schocher a écrit : +#defineCONFIG_RELOC_FIXUP_WORKS I believe this is now common to all ARMs, hence unneeded in config files. Hmm.. instead we should remove in arch/arm/include/asm/config.h 24 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC) 25 /* Relocation to SDRAM works on all ARM boards */ 26 #define CONFIG_RELOC_FIXUP_WORKS 27 #endif this #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC) ... #endif This is already done in my first patchset -- unless I did it wrong of course. Amicalement, -- Albert. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
[U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations
Signed-off-by: Wolfgang Denk w...@denx.de Signed-off-by: Heiko Schocher h...@denx.de --- arch/arm/cpu/arm1136/start.S| 171 ++- arch/arm/cpu/arm1136/u-boot.lds |8 ++ include/configs/qong.h |2 +- 3 files changed, 105 insertions(+), 76 deletions(-) diff --git a/arch/arm/cpu/arm1136/start.S b/arch/arm/cpu/arm1136/start.S index 494768e..a86114b 100644 --- a/arch/arm/cpu/arm1136/start.S +++ b/arch/arm/cpu/arm1136/start.S @@ -89,48 +89,35 @@ _end_vect: _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_end -_bss_end: - .word _end - -#if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC) -.globl _datarel_start -_datarel_start: - .word __datarel_start +.globl _bss_start_ofs +_bss_start_ofs: + .word __bss_start - _start -.globl _datarelrolocal_start -_datarelrolocal_start: - .word __datarelrolocal_start +.globl _bss_end_ofs +_bss_end_ofs: + .word _end - _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 -#endif +.globl _datarelro_start_ofs +_datarelro_start_ofs: + .word __datarelro_start - _start #ifdef CONFIG_USE_IRQ /* IRQ stack memory (calculated at run-time) */ @@ -225,9 +212,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 @@ -239,36 +225,54 @@ copy_loop: blo copy_loop #ifndef CONFIG_PRELOADER - /* fix got entries */ - ldr r1, _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 +
Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations
Dear Albert ARIBAUD, In message 4cb478d4.3030...@free.fr you wrote: Le 12/10/2010 13:31, Heiko Schocher a écrit : Signed-off-by: Wolfgang Denkw...@denx.de Signed-off-by: Heiko Schocherh...@denx.de --- I assume this is [ELF_RELOC], not [NEW_RELOC], right? I'm asking because using the same tag for all elf_reloc branch related patches makes it easier to find them all back. diff --git a/arch/arm/cpu/arm1136/u-boot.lds b/arch/arm/cpu/arm1136/u-boot.lds + __dynsym_start = .; + .dynsym : { *(.dynsym) } + __got_start = .; . = ALIGN(4); .got : { *(.got) } Do you need to keep .got in the linker file? I think it can be removed. You could also add /DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.interp*) } /DISCARD/ : { *(.gnu*) } At the end of the sections statement. Agreed. Heiko, can you please retest / resubmit? Thanks. diff --git a/include/configs/qong.h b/include/configs/qong.h +#defineCONFIG_RELOC_FIXUP_WORKS I believe this is now common to all ARMs, hence unneeded in config files. This should then be done for all board, i. e. in a separate commit. 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: w...@denx.de The day-to-day travails of the IBM programmer are so amusing to most of us who are fortunate enough never to have been one - like watching Charlie Chaplin trying to cook a shoe. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations
Hello Albert, Albert ARIBAUD wrote: Le 12/10/2010 13:31, Heiko Schocher a écrit : Signed-off-by: Wolfgang Denkw...@denx.de Signed-off-by: Heiko Schocherh...@denx.de --- I assume this is [ELF_RELOC], not [NEW_RELOC], right? I'm asking because using the same tag for all elf_reloc branch related patches makes it easier to find them all back. Ups, you are right, fix this. diff --git a/arch/arm/cpu/arm1136/u-boot.lds b/arch/arm/cpu/arm1136/u-boot.lds +__dynsym_start = .; +.dynsym : { *(.dynsym) } + __got_start = .; . = ALIGN(4); .got : { *(.got) } Do you need to keep .got in the linker file? I think it can be removed. Hmm.. think you are right, I try this, thanks. You could also add /DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.interp*) } /DISCARD/ : { *(.gnu*) } At the end of the sections statement. Ok. diff --git a/include/configs/qong.h b/include/configs/qong.h +#define CONFIG_RELOC_FIXUP_WORKS I believe this is now common to all ARMs, hence unneeded in config files. Hmm.. instead we should remove in arch/arm/include/asm/config.h 24 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC) 25 /* Relocation to SDRAM works on all ARM boards */ 26 #define CONFIG_RELOC_FIXUP_WORKS 27 #endif this #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC) ... #endif And remove for all arm board, which now define CONFIG_RELOC_FIXUP_WORKS this in the config file. If you are OK with that, I can make such a patch. bye, Heiko -- DENX Software Engineering GmbH, MD: Wolfgang Denk Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations
Hello Wolfgang, Wolfgang Denk wrote: Dear Albert ARIBAUD, In message 4cb478d4.3030...@free.fr you wrote: Le 12/10/2010 13:31, Heiko Schocher a écrit : Signed-off-by: Wolfgang Denkw...@denx.de Signed-off-by: Heiko Schocherh...@denx.de --- I assume this is [ELF_RELOC], not [NEW_RELOC], right? I'm asking because using the same tag for all elf_reloc branch related patches makes it easier to find them all back. diff --git a/arch/arm/cpu/arm1136/u-boot.lds b/arch/arm/cpu/arm1136/u-boot.lds + __dynsym_start = .; + .dynsym : { *(.dynsym) } + __got_start = .; . = ALIGN(4); .got : { *(.got) } Do you need to keep .got in the linker file? I think it can be removed. You could also add /DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.interp*) } /DISCARD/ : { *(.gnu*) } At the end of the sections statement. Agreed. Heiko, can you please retest / resubmit? Thanks. diff --git a/include/configs/qong.h b/include/configs/qong.h +#defineCONFIG_RELOC_FIXUP_WORKS I believe this is now common to all ARMs, hence unneeded in config files. This should then be done for all board, i. e. in a separate commit. This should be done in arch/arm/include/asm/config.h Hmm.. as I have to fix this patch for qong board, should I do a patchseries which removes first CONFIG_RELOC_FIXUP_WORKS in config files and then a second, which converts the qong board for elf relocation? bye, Heiko -- DENX Software Engineering GmbH, MD: Wolfgang Denk Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot