[U-Boot] [PATCH RFC] arm920t: implement elf relocation
Signed-off-by: Andreas Bießmann andreas.de...@googlemail.com --- This changes give segfault in at least codesourcery 2010q1-202 arm lite toolchain. To test this segfault use: # make at91rm9200ek_config # make arch/arm/cpu/arm920t/start.S| 122 --- arch/arm/cpu/arm920t/u-boot.lds | 26 + 2 files changed, 78 insertions(+), 70 deletions(-) diff --git a/arch/arm/cpu/arm920t/start.S b/arch/arm/cpu/arm920t/start.S index d4edde7..adaf193 100644 --- a/arch/arm/cpu/arm920t/start.S +++ b/arch/arm/cpu/arm920t/start.S @@ -77,14 +77,17 @@ _TEXT_BASE: /* * 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) */ @@ -103,30 +106,6 @@ 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 _datarelro_start -_datarelro_start: - .word __datarelro_start - -.globl _got_start -_got_start: - .word __got_start - -.globl _got_end -_got_end: - .word __got_end - /* * the actual start code */ @@ -230,9 +209,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 @@ -243,35 +221,53 @@ copy_loop: blo 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 offset */ + add r10, r10, r0/* r10 - sym table in FLASH */ + ldr r2, _rel_dyn_start_ofs /* r2 - rel dyn start offset */ + add r2, r2, r0 /* r2 - rel dyn start in FLASH */ + ldr r3, _rel_dyn_end_ofs/* r3 - rel dyn end offset */ + 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, 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 (offste) 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 address */ + 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 blo fixloop #endif 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, #0x /* clear*/ @@ -289,12 +285,14 @@ clbss_l:str
Re: [U-Boot] [PATCH RFC] arm920t: implement elf relocation
Thanks Andreas for this helpful contribution; I'll look up the .plt section and see if it may lead to the root cause of the issue. However: Le 31/10/2010 08:25, Andreas Bießmann a écrit : Signed-off-by: Andreas Bießmannandreas.de...@googlemail.com --- This changes give segfault in at least codesourcery 2010q1-202 arm lite toolchain. To test this segfault use: # make at91rm9200ek_config # make arch/arm/cpu/arm920t/start.S| 122 --- arch/arm/cpu/arm920t/u-boot.lds | 26 + 2 files changed, 78 insertions(+), 70 deletions(-) diff --git a/arch/arm/cpu/arm920t/start.S b/arch/arm/cpu/arm920t/start.S index d4edde7..adaf193 100644 --- a/arch/arm/cpu/arm920t/start.S +++ b/arch/arm/cpu/arm920t/start.S @@ -77,14 +77,17 @@ _TEXT_BASE: /* * 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 This patch seems to apply to u-boot before ELF relocation was introduced. Can you make it against the latest master? Amicalement, -- Albert. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH RFC] arm920t: implement elf relocation
Dear Albert Aribaud, Am 31.10.2010 um 08:28 schrieb Albert ARIBAUD: Thanks Andreas for this helpful contribution; I'll look up the .plt section and see if it may lead to the root cause of the issue. However: Le 31/10/2010 08:25, Andreas Bießmann a écrit : Signed-off-by: Andreas Bießmannandreas.de...@googlemail.com --- This patch seems to apply to u-boot before ELF relocation was introduced. Can you make it against the latest master? It should be against the latest master: ---8--- 843e147 arm920t: implement elf relocation 0c0892b Merge branch 'master' of git://git.denx.de/u-boot-marvell d75c2a3 Merge branch 'master' of git://git.denx.de/u-boot-imx 17dd883 Merge branch 'master' of git://git.denx.de/u-boot-samsung 3388db2 Merge branch 'master' of git://git.denx.de/u-boot-blackfin 1ecb758 Merge branch 'for-wd-master' of git://git.denx.de/u-boot-pxa e03f316 Drop support for CONFIG_SKIP_RELOCATE_UBOOT a9aa392 Drop support for CONFIG_SYS_ARM_WITHOUT_RELOC ... ---8--- The latest merges where within 35 hours, maybe you have missed them? regards Andreas Bießmann ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH RFC] arm920t: implement elf relocation
Le 31/10/2010 08:39, Andreas Bießmann a écrit : Dear Albert Aribaud, Am 31.10.2010 um 08:28 schrieb Albert ARIBAUD: Thanks Andreas for this helpful contribution; I'll look up the .plt section and see if it may lead to the root cause of the issue. However: Le 31/10/2010 08:25, Andreas Bießmann a écrit : Signed-off-by: Andreas Bießmannandreas.de...@googlemail.com --- This patch seems to apply to u-boot before ELF relocation was introduced. Can you make it against the latest master? It should be against the latest master: ---8--- 843e147 arm920t: implement elf relocation 0c0892b Merge branch 'master' of git://git.denx.de/u-boot-marvell d75c2a3 Merge branch 'master' of git://git.denx.de/u-boot-imx 17dd883 Merge branch 'master' of git://git.denx.de/u-boot-samsung 3388db2 Merge branch 'master' of git://git.denx.de/u-boot-blackfin 1ecb758 Merge branch 'for-wd-master' of git://git.denx.de/u-boot-pxa e03f316 Drop support for CONFIG_SKIP_RELOCATE_UBOOT a9aa392 Drop support for CONFIG_SYS_ARM_WITHOUT_RELOC ... ---8--- The latest merges where within 35 hours, maybe you have missed them? No but I'd missed the mergeback of elf_reloc to master and thought all ARMs were converted to ELF relocation then. Obviously arm920t was not, (neither were sa1100, lh7a40x, s3c44b0, arm720t, ixp, arm_intcm, arm925t and arm946es). regards Andreas Bießmann Amicalement, -- Albert. ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot