* [U-Boot] ARM: problems with elf relocation on arm920t / maybe toolchain related
@ 2010-10-31 7:11 Andreas Bießmann
2010-10-31 7:25 ` [U-Boot] [PATCH RFC] arm920t: implement elf relocation Andreas Bießmann
` (2 more replies)
0 siblings, 3 replies; 19+ messages in thread
From: Andreas Bießmann @ 2010-10-31 7:11 UTC (permalink / raw)
To: u-boot
Dear Albert Aribaud,
in reply to http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/88014/focus=88022 I have to tell another issue. I try to get the elf relocation stuff working for arm920t and run into some compiler issues. Sorry, had no time to investigate that but maybe one has some pointers?
I have have adopted your changes to arm926ejs to arm920t and built that with my own toolchain (gcc 4.5.1, binutils 2.20.1.20100303) and codesourcery 2010q1-202. The codesourcery report is compareable so i send it here:
---8<---
...
cd /tmp/build_uboot-at91rm9200ek && arm-none-linux-gnueabi-ld -Bstatic -T /tmp/build_uboot-at91rm9200ek/u-boot.lds -pie -Ttext 0x21000000 $UNDEF_SYM arch/arm/cpu/arm920t/start.o --start-group lib/libgeneric.a lib/lzma/liblzma.a lib/lzo/liblzo.a arch/arm/cpu/arm920t/libarm920t.a arch/arm/cpu/arm920t/at91/libat91.a arch/arm/lib/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a fs/yaffs2/libyaffs2.a fs/ubifs/libubifs.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/fpga/libfpga.a drivers/gpio/libgpio.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/onenand/libonenand.a drivers/mtd/ubi/libubi.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/power/libpower.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/twserial/libtws.a drivers/usb/gadget/libusb_gadget.a drivers/usb/host/libusb_host.a drivers/usb/musb/libusb_musb.a drivers/usb/phy/libusb_phy.a drivers/video/libvideo.a drivers/watchdog/libwatchdog.a common/libcommon.a lib/libfdt/libfdt.a api/libapi.a post/libpost.a board/atmel/at91rm9200ek/libat91rm9200ek.a --end-group /tmp/build_uboot-at91rm9200ek/arch/arm/lib/eabi_compat.o -L /home/andreas/src/arm-2010q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1 -lgcc -Map u-boot.map -o u-boot
arm-none-linux-gnueabi-ld: BFD (Sourcery G++ Lite 2010q1-202) 2.19.51.20090709 assertion fail /scratch/julian/2010q1-release-linux-lite/obj/binutils-src-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu/bfd/elf32-arm.c:12338
arm-none-linux-gnueabi-ld: BFD (Sourcery G++ Lite 2010q1-202) 2.19.51.20090709 assertion fail /scratch/julian/2010q1-release-linux-lite/obj/binutils-src-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu/bfd/elf32-arm.c:12572
/bin/sh: line 1: 12104 Speicherzugriffsfehler arm-none-linux-gnueabi-ld -Bstatic -T /tmp/build_uboot-at91rm9200ek/u-boot.lds -pie -Ttext 0x21000000 $UNDEF_SYM arch/arm/cpu/arm920t/start.o --start-group lib/libgeneric.a lib/lzma/liblzma.a lib/lzo/liblzo.a arch/arm/cpu/arm920t/libarm920t.a arch/arm/cpu/arm920t/at91/libat91.a arch/arm/lib/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a fs/yaffs2/libyaffs2.a fs/ubifs/libubifs.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/fpga/libfpga.a drivers/gpio/libgpio.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/onenand/libonenand.a drivers/mtd/ubi/libubi.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/power/libpower.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/twserial/libtws.a drivers/usb/gadget/libusb_gadget.a drivers/usb/host/libusb_host.a drivers/usb/musb/libusb_musb.a drivers/usb/phy/libusb_phy.a drivers/video/libvideo.a drivers/watchdog/libwatchdog.a common/libcommon.a lib/libfdt/libfdt.a api/libapi.a post/libpost.a board/atmel/at91rm9200ek/libat91rm9200ek.a --end-group /tmp/build_uboot-at91rm9200ek/arch/arm/lib/eabi_compat.o -L /home/andreas/src/arm-2010q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1 -lgcc -Map u-boot.map -o u-boot
make: *** [/tmp/build_uboot-at91rm9200ek/u-boot] Fehler 139
...
--->8---
My self built toolchain runs into the same assertions, I think so at least. I wonder whether this is a pure toolchain problem/bug or if it have some connection to the input and maybe we are missing a essential thing? I had a short look into the binutils code and found it crashes when looking up .plt sections which are discarded in linker script. See the following snippet of binutils-2.20.1/bfd/elf32-arm.c near lines 12337
---8<---
static bfd_boolean
elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
...
if (elf_hash_table (info)->dynamic_sections_created)
...
for (; dyncon < dynconend; dyncon++)
...
bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
switch (dyn.d_tag)
...
case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd,
RELOC_SECTION (htab, ".plt"));
BFD_ASSERT (s != NULL); <- second assertion
dyn.d_un.d_val = s->size; <- segfault
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break;
...
--->8---
My changes in arm920t/start.S will follow. The board to test is at91rm9200ek. Maybe one can test my changes with ELDK toolchain?
regards
Andreas Bie?mann
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH RFC] arm920t: implement elf relocation
2010-10-31 7:11 [U-Boot] ARM: problems with elf relocation on arm920t / maybe toolchain related Andreas Bießmann
@ 2010-10-31 7:25 ` Andreas Bießmann
2010-10-31 7:28 ` Albert ARIBAUD
2010-11-03 23:21 ` [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board() Andreas Bießmann
2010-11-03 23:21 ` [U-Boot] [PATCH v2 2/2] arm920t: implement elf relocation Andreas Bießmann
2 siblings, 1 reply; 19+ messages in thread
From: Andreas Bießmann @ 2010-10-31 7:25 UTC (permalink / raw)
To: u-boot
Signed-off-by: Andreas Bie?mann <andreas.devel@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, #0x00000000 /* clear */
@@ -289,12 +285,14 @@ 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
+ ldr r2, _board_init_r_ofs
sub r2, r2, r0
add r2, r2, r7 /* position from board_init_r in RAM */
/* setup parameters for board_init_r */
@@ -304,9 +302,17 @@ _nand_boot: .word nand_boot
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
+
/*
*************************************************************************
*
@@ -317,8 +323,6 @@ _board_init_r: .word board_init_r
*
*************************************************************************
*/
-
-
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
diff --git a/arch/arm/cpu/arm920t/u-boot.lds b/arch/arm/cpu/arm920t/u-boot.lds
index 6985434..2a4ac8f 100644
--- a/arch/arm/cpu/arm920t/u-boot.lds
+++ b/arch/arm/cpu/arm920t/u-boot.lds
@@ -49,21 +49,19 @@ SECTIONS
. = ALIGN(4);
.data : {
*(.data)
- __datarel_start = .;
- *(.data.rel)
- __datarelrolocal_start = .;
- *(.data.rel.ro.local)
- __datarellocal_start = .;
- *(.data.rel.local)
- __datarelro_start = .;
- *(.data.rel.ro)
}
- __got_start = .;
. = ALIGN(4);
- .got : { *(.got) }
- __got_end = .;
+ __rel_dyn_start = .;
+ .rel.dyn : { *(.rel.dyn) }
+ __rel_dyn_end = .;
+
+ __dynsym_start = .;
+ .dynsym : { *(.dynsym) }
+
+ . = ALIGN(4);
+
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
@@ -73,4 +71,10 @@ SECTIONS
__bss_start = .;
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
_end = .;
+
+ /DISCARD/ : { *(.dynstr*) }
+ /DISCARD/ : { *(.dynamic*) }
+ /DISCARD/ : { *(.plt*) }
+ /DISCARD/ : { *(.interp*) }
+ /DISCARD/ : { *(.gnu*) }
}
--
1.7.3.2
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH RFC] arm920t: implement elf relocation
2010-10-31 7:25 ` [U-Boot] [PATCH RFC] arm920t: implement elf relocation Andreas Bießmann
@ 2010-10-31 7:28 ` Albert ARIBAUD
2010-10-31 7:39 ` Andreas Bießmann
0 siblings, 1 reply; 19+ messages in thread
From: Albert ARIBAUD @ 2010-10-31 7:28 UTC (permalink / raw)
To: u-boot
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?mann<andreas.devel@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.
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH RFC] arm920t: implement elf relocation
2010-10-31 7:28 ` Albert ARIBAUD
@ 2010-10-31 7:39 ` Andreas Bießmann
2010-10-31 7:49 ` Albert ARIBAUD
0 siblings, 1 reply; 19+ messages in thread
From: Andreas Bießmann @ 2010-10-31 7:39 UTC (permalink / raw)
To: u-boot
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?mann<andreas.devel@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
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH RFC] arm920t: implement elf relocation
2010-10-31 7:39 ` Andreas Bießmann
@ 2010-10-31 7:49 ` Albert ARIBAUD
0 siblings, 0 replies; 19+ messages in thread
From: Albert ARIBAUD @ 2010-10-31 7:49 UTC (permalink / raw)
To: u-boot
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?mann<andreas.devel@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.
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-10-31 7:11 [U-Boot] ARM: problems with elf relocation on arm920t / maybe toolchain related Andreas Bießmann
2010-10-31 7:25 ` [U-Boot] [PATCH RFC] arm920t: implement elf relocation Andreas Bießmann
@ 2010-11-03 23:21 ` Andreas Bießmann
2010-11-04 1:00 ` Joakim Tjernlund
2010-11-03 23:21 ` [U-Boot] [PATCH v2 2/2] arm920t: implement elf relocation Andreas Bießmann
2 siblings, 1 reply; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-03 23:21 UTC (permalink / raw)
To: u-boot
The arm920t compiler/linker dif not handle weak functions correctely.
Therefore the linker tried to link outside the ELF (isn't that lazy
linking?). This leads to segfault of linker in the end.
This patch adds a empty stub for weak function reset_board() to catch
that case.
Signed-off-by: Andreas Bie?mann <andreas.devel@googlemail.com>
---
introduced in v2
arch/arm/cpu/arm920t/at91/reset.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/arch/arm/cpu/arm920t/at91/reset.c b/arch/arm/cpu/arm920t/at91/reset.c
index ce9c156..8c81030 100644
--- a/arch/arm/cpu/arm920t/at91/reset.c
+++ b/arch/arm/cpu/arm920t/at91/reset.c
@@ -35,7 +35,14 @@
#include <asm/arch/hardware.h>
#include <asm/arch/at91_st.h>
-void board_reset(void) __attribute__((__weak__));
+void __attribute__((weak)) board_reset(void)
+{
+ /*
+ * do absolute nothing here
+ * but to have a empty stub for weak function to satisfy the linker
+ */
+}
void reset_cpu(ulong ignored)
{
@@ -45,8 +52,7 @@ void reset_cpu(ulong ignored)
serial_exit();
#endif
- if (board_reset)
- board_reset();
+ board_reset();
/* Reset the cpu by setting up the watchdog timer */
writel(AT91_ST_WDMR_RSTEN | AT91_ST_WDMR_EXTEN | AT91_ST_WDMR_WDV(2),
--
1.7.3.2
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 2/2] arm920t: implement elf relocation
2010-10-31 7:11 [U-Boot] ARM: problems with elf relocation on arm920t / maybe toolchain related Andreas Bießmann
2010-10-31 7:25 ` [U-Boot] [PATCH RFC] arm920t: implement elf relocation Andreas Bießmann
2010-11-03 23:21 ` [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board() Andreas Bießmann
@ 2010-11-03 23:21 ` Andreas Bießmann
2010-11-03 23:29 ` [U-Boot] [PATCH v3] " Andreas Bießmann
[not found] ` <sebastien.carlier@2d91f447722561d137e769820c0e333bcce282ff>
2 siblings, 2 replies; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-03 23:21 UTC (permalink / raw)
To: u-boot
This is mostly a copy of arm926ejs relocation and known to _not_ work
correctly a.t.m!
Signed-off-by: Andreas Bie?mann <andreas.devel@googlemail.com>
---
changes since v1:
- adopted linker script as in patch series v3 "arm926ejs: fix linker file for newer ld support"
* move rel.dyn and dynsym after bss
* overlay bss with rel.dyn
- double checked fixup loop in start.S
-> there is still an error in relocation fixup loop breaks the boot,
the board hangs after "relocation Offset is: 00f80000"
Dear Albert Aribaud,
can you please have a look for that?
arch/arm/cpu/arm920t/start.S | 122 ++++++++++++++++++++-------------------
arch/arm/cpu/arm920t/u-boot.lds | 37 +++++++-----
2 files changed, 86 insertions(+), 73 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, #0x00000000 /* clear */
@@ -289,12 +285,14 @@ 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
+ ldr r2, _board_init_r_ofs
sub r2, r2, r0
add r2, r2, r7 /* position from board_init_r in RAM */
/* setup parameters for board_init_r */
@@ -304,9 +302,17 @@ _nand_boot: .word nand_boot
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
+
/*
*************************************************************************
*
@@ -317,8 +323,6 @@ _board_init_r: .word board_init_r
*
*************************************************************************
*/
-
-
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
diff --git a/arch/arm/cpu/arm920t/u-boot.lds b/arch/arm/cpu/arm920t/u-boot.lds
index 6985434..d16e36d 100644
--- a/arch/arm/cpu/arm920t/u-boot.lds
+++ b/arch/arm/cpu/arm920t/u-boot.lds
@@ -49,28 +49,37 @@ SECTIONS
. = ALIGN(4);
.data : {
*(.data)
- __datarel_start = .;
- *(.data.rel)
- __datarelrolocal_start = .;
- *(.data.rel.ro.local)
- __datarellocal_start = .;
- *(.data.rel.local)
- __datarelro_start = .;
- *(.data.rel.ro)
}
- __got_start = .;
. = ALIGN(4);
- .got : { *(.got) }
- __got_end = .;
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
- __bss_start = .;
- .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
- _end = .;
+ .bss (NOLOAD) : {
+ __bss_start = .;
+ *(.bss)
+ . = ALIGN(4);
+ _end = .;
+ }
+
+ .rel.dyn __bss_start (OVERLAY) : {
+ __rel_dyn_start = .;
+ *(.rel*)
+ __rel_dyn_end = .;
+ }
+
+ .dynsym : {
+ __dynsym_start = .;
+ *(.dynsym)
+ }
+
+ /DISCARD/ : { *(.dynstr*) }
+ /DISCARD/ : { *(.dynamic*) }
+ /DISCARD/ : { *(.plt*) }
+ /DISCARD/ : { *(.interp*) }
+ /DISCARD/ : { *(.gnu*) }
}
--
1.7.3.2
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v3] arm920t: implement elf relocation
2010-11-03 23:21 ` [U-Boot] [PATCH v2 2/2] arm920t: implement elf relocation Andreas Bießmann
@ 2010-11-03 23:29 ` Andreas Bießmann
2010-11-04 6:14 ` Albert ARIBAUD
[not found] ` <sebastien.carlier@2d91f447722561d137e769820c0e333bcce282ff>
1 sibling, 1 reply; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-03 23:29 UTC (permalink / raw)
To: u-boot
This is mostly a copy of arm926ejs relocation and known to _not_ work
correctly a.t.m!
Signed-off-by: Andreas Bie?mann <andreas.devel@googlemail.com>
---
changes since v1:
- adopted linker script as in patch series v3 "arm926ejs: fix linker file for newer ld support"
* move rel.dyn and dynsym after bss
* overlay bss with rel.dyn
- double checked fixup loop in start.S
-> there is still an error in relocation fixup loop breaks the boot,
the board hangs after "relocation Offset is: 00f80000"
Dear Albert Aribaud,
can you please have a look for that?
changes since v2:
- add missed parts in "branch board_init_r"
Dear Albert Aribaud,
still not working, do you have any advice?
arch/arm/cpu/arm920t/start.S | 129 ++++++++++++++++++++-------------------
arch/arm/cpu/arm920t/u-boot.lds | 37 +++++++----
2 files changed, 89 insertions(+), 77 deletions(-)
diff --git a/arch/arm/cpu/arm920t/start.S b/arch/arm/cpu/arm920t/start.S
index d4edde7..c547181 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 _bss_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
*/
@@ -164,7 +143,7 @@ copyex:
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
-#else
+# else
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
@@ -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, #0x00000000 /* clear */
@@ -289,24 +285,33 @@ clbss_l:str r2, [r0] /* clear loop... */
* initialization, now running from RAM.
*/
#ifdef CONFIG_NAND_SPL
- ldr pc, _nand_boot
+ ldr r0, _nand_boot_ofs
+ mov pc, r0
-_nand_boot: .word nand_boot
+_nand_boot_ofs:
+ .word nand_boot
#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 lr, r0, r1
+ add lr, lr, r9 /* position from board_init_r in RAM */
/* 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
+
/*
*************************************************************************
*
@@ -317,8 +322,6 @@ _board_init_r: .word board_init_r
*
*************************************************************************
*/
-
-
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
diff --git a/arch/arm/cpu/arm920t/u-boot.lds b/arch/arm/cpu/arm920t/u-boot.lds
index 6985434..d647952 100644
--- a/arch/arm/cpu/arm920t/u-boot.lds
+++ b/arch/arm/cpu/arm920t/u-boot.lds
@@ -49,28 +49,37 @@ SECTIONS
. = ALIGN(4);
.data : {
*(.data)
- __datarel_start = .;
- *(.data.rel)
- __datarelrolocal_start = .;
- *(.data.rel.ro.local)
- __datarellocal_start = .;
- *(.data.rel.local)
- __datarelro_start = .;
- *(.data.rel.ro)
}
- __got_start = .;
. = ALIGN(4);
- .got : { *(.got) }
- __got_end = .;
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
- __bss_start = .;
- .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
- _end = .;
+ .bss (NOLOAD) : {
+ __bss_start = .;
+ *(.bss)
+ . = ALIGN(4);
+ _bss_end = .;
+ }
+
+ .rel.dyn __bss_start (OVERLAY) : {
+ __rel_dyn_start = .;
+ *(.rel*)
+ __rel_dyn_end = .;
+ }
+
+ .dynsym : {
+ __dynsym_start = .;
+ *(.dynsym)
+ }
+
+ /DISCARD/ : { *(.dynstr*) }
+ /DISCARD/ : { *(.dynamic*) }
+ /DISCARD/ : { *(.plt*) }
+ /DISCARD/ : { *(.interp*) }
+ /DISCARD/ : { *(.gnu*) }
}
--
1.7.3.2
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-03 23:21 ` [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board() Andreas Bießmann
@ 2010-11-04 1:00 ` Joakim Tjernlund
2010-11-04 1:13 ` Graeme Russ
0 siblings, 1 reply; 19+ messages in thread
From: Joakim Tjernlund @ 2010-11-04 1:00 UTC (permalink / raw)
To: u-boot
>
> The arm920t compiler/linker dif not handle weak functions correctely.
> Therefore the linker tried to link outside the ELF (isn't that lazy
> linking?). This leads to segfault of linker in the end.
>
> This patch adds a empty stub for weak function reset_board() to catch
> that case.
I believe this is the wrong approach.
Instead you should fix the relocation/fixup routine not to relocate
NULL ptrs. NULL ptrs are absolute values and should be left as is.
See http://git.denx.de/?p=u-boot.git;a=commit;h=d1e0b10accdbac2e0a8b2cbf7c589645442f87c5
for a fix to ppc that went in recently
Jocke
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-04 1:00 ` Joakim Tjernlund
@ 2010-11-04 1:13 ` Graeme Russ
2010-11-04 1:23 ` Joakim Tjernlund
0 siblings, 1 reply; 19+ messages in thread
From: Graeme Russ @ 2010-11-04 1:13 UTC (permalink / raw)
To: u-boot
On Thu, Nov 4, 2010 at 12:00 PM, Joakim Tjernlund
<joakim.tjernlund@transmode.se> wrote:
>
>>
>> The arm920t compiler/linker dif not handle weak functions correctely.
>> Therefore the linker tried to link outside the ELF (isn't that lazy
>> linking?). This leads to segfault of linker in the end.
>>
>> This patch adds a empty stub for weak function reset_board() to catch
>> that case.
>
> I believe this is the wrong approach.
> Instead you should fix the relocation/fixup routine not to relocate
> NULL ptrs. NULL ptrs are absolute values and should be left as is.
>
> See http://git.denx.de/?p=u-boot.git;a=commit;h=d1e0b10accdbac2e0a8b2cbf7c589645442f87c5
> for a fix to ppc that went in recently
>
I seem to recall a discussion some time ago regarding the use of the
"if (function())" construct versus calls to weakly defined empty functions
but cannot remember the outcome.
I personally think weak functions are 'cleaner' but may result in slightly
larger and slower code due to the call overhead (is the optimiser clever
enough to strip these out if the stub function is empty?)
Would converting all instances of "if (function())" to weak functions be
such a bad thing?
Regards,
Graeme
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-04 1:13 ` Graeme Russ
@ 2010-11-04 1:23 ` Joakim Tjernlund
2010-11-04 3:27 ` Sebastien Carlier
2010-11-04 10:41 ` Andreas Bießmann
0 siblings, 2 replies; 19+ messages in thread
From: Joakim Tjernlund @ 2010-11-04 1:23 UTC (permalink / raw)
To: u-boot
Graeme Russ <graeme.russ@gmail.com> wrote on 2010/11/04 02:13:44:
>
> On Thu, Nov 4, 2010 at 12:00 PM, Joakim Tjernlund
> <joakim.tjernlund@transmode.se> wrote:
> >
> >>
> >> The arm920t compiler/linker dif not handle weak functions correctely.
> >> Therefore the linker tried to link outside the ELF (isn't that lazy
> >> linking?). This leads to segfault of linker in the end.
> >>
> >> This patch adds a empty stub for weak function reset_board() to catch
> >> that case.
> >
> > I believe this is the wrong approach.
> > Instead you should fix the relocation/fixup routine not to relocate
> > NULL ptrs. NULL ptrs are absolute values and should be left as is.
> >
> > See http://git.denx.de/?p=u-boot.git;a=commit;h=d1e0b10accdbac2e0a8b2cbf7c589645442f87c5
> > for a fix to ppc that went in recently
> >
>
> I seem to recall a discussion some time ago regarding the use of the
> "if (function())" construct versus calls to weakly defined empty functions
> but cannot remember the outcome.
Me neither.
>
> I personally think weak functions are 'cleaner' but may result in slightly
> larger and slower code due to the call overhead (is the optimiser clever
> enough to strip these out if the stub function is empty?)
No idea.
>
> Would converting all instances of "if (function())" to weak functions be
> such a bad thing?
nope, but I still think the reloc routine(s) needs to be fixed.
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-04 1:23 ` Joakim Tjernlund
@ 2010-11-04 3:27 ` Sebastien Carlier
2010-11-04 10:54 ` Andreas Bießmann
2010-11-04 10:41 ` Andreas Bießmann
1 sibling, 1 reply; 19+ messages in thread
From: Sebastien Carlier @ 2010-11-04 3:27 UTC (permalink / raw)
To: u-boot
These weakly defined empty functions prevent the strong definition
from being linked in.
For example, libarm.a contains a weak symbol 'red_LED_on', which is
expected to be defined (strongly) in the board library. Because
archive libraries are being used, this fails (testing with binutils
2.20.1), and only the empty __red_LED_on stub is linked in; the
red_LED_on definition in the board library is throw away.
This behavior is documented and it is the intended one; from
http://www.sco.com/developers/gabi/latest/ch4.symtab.html:
> When the link editor searches archive libraries [see ``Archive
> File'' in Chapter 7], it extracts archive members that contain
> definitions of undefined global symbols.
> The member's definition may be either a global or a weak symbol.
> The link editor does not extract archive members to resolve
> undefined weak symbols. Unresolved weak symbols have a zero value.
Empty weak definitions would have to be supplied to the linker only
_after_ the strong definitions have been provided.
Leaving undefined weak symbols and testing for NULL-ity at call sites
seems to be a more robust approach.
Note that with some ld versions (at least with 2.20.1), ld creates PLT
entries for undefined weak symbols and crashes when the PLT-related
sections (.plt, .got.plt, and .rel.plt) are discarded...
--
Sebastien Carlier
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v3] arm920t: implement elf relocation
2010-11-03 23:29 ` [U-Boot] [PATCH v3] " Andreas Bießmann
@ 2010-11-04 6:14 ` Albert ARIBAUD
2010-11-04 10:15 ` Andreas Bießmann
0 siblings, 1 reply; 19+ messages in thread
From: Albert ARIBAUD @ 2010-11-04 6:14 UTC (permalink / raw)
To: u-boot
Hi Andreas,
Le 04/11/2010 00:29, Andreas Bie?mann a ?crit :
> This is mostly a copy of arm926ejs relocation and known to _not_ work
> correctly a.t.m!
Can you give a specific case of board and toolchain that does not work?
Amicalement,
--
Albert.
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v3] arm920t: implement elf relocation
2010-11-04 6:14 ` Albert ARIBAUD
@ 2010-11-04 10:15 ` Andreas Bießmann
2010-11-04 12:37 ` Albert ARIBAUD
0 siblings, 1 reply; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-04 10:15 UTC (permalink / raw)
To: u-boot
Hi Albert,
Am 04.11.2010 07:14, schrieb Albert ARIBAUD:
> Hi Andreas,
>
> Le 04/11/2010 00:29, Andreas Bie?mann a ?crit :
>> This is mostly a copy of arm926ejs relocation and known to _not_ work
>> correctly a.t.m!
>
> Can you give a specific case of board and toolchain that does not work?
at91rm9200ek_ram_config (patch sent these days, is at91rm9200ek_config
with TEXT_BASE in RAM and SKIP_LOWLEVEL_INIT set). Toolchain was a
selfbuilt gcc-4.5.1 + binutils 2.20.1.20100303, can check CS 2010-q1
this evening.
regards
Andreas Bie?mann
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-04 1:23 ` Joakim Tjernlund
2010-11-04 3:27 ` Sebastien Carlier
@ 2010-11-04 10:41 ` Andreas Bießmann
1 sibling, 0 replies; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-04 10:41 UTC (permalink / raw)
To: u-boot
Dear all,
Am 04.11.2010 02:23, schrieb Joakim Tjernlund:
> Graeme Russ <graeme.russ@gmail.com> wrote on 2010/11/04 02:13:44:
>>
>> On Thu, Nov 4, 2010 at 12:00 PM, Joakim Tjernlund
>> <joakim.tjernlund@transmode.se> wrote:
>>>
>>>>
>>>> The arm920t compiler/linker dif not handle weak functions correctely.
>>>> Therefore the linker tried to link outside the ELF (isn't that lazy
>>>> linking?). This leads to segfault of linker in the end.
>>>>
>>>> This patch adds a empty stub for weak function reset_board() to catch
>>>> that case.
>>>
>>> I believe this is the wrong approach.
>>> Instead you should fix the relocation/fixup routine not to relocate
>>> NULL ptrs. NULL ptrs are absolute values and should be left as is.
This is ok and should be fixed in reloc routine. But it seems these
undefined weak functions are _not_ null for me (have to check this ...).
>> I personally think weak functions are 'cleaner' but may result in slightly
>> larger and slower code due to the call overhead (is the optimiser clever
>> enough to strip these out if the stub function is empty?)
>
> No idea.
It seems my linker do not strip these functions. As Sebastian pointed
out the linker adds .plt sections for these undefined weak functions. Do
we use the linker in right way?
>> Would converting all instances of "if (function())" to weak functions be
>> such a bad thing?
>
> nope, but I still think the reloc routine(s) needs to be fixed.
If reloc routine is defective, it will be fixed ... currently the link
of weak functions is the bigger problem. Without the empty stub for
reset_board() my linker segfaults. Can please one test this issue with
e.g. ELDK or other toolchains? CS 2010-q1 is known to be defective too!
To test the described issue use '[PATCH v3] arm920t: implement elf
relocation' and build for at91rm9200ek.
regards
Andreas Bie?mann
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-04 3:27 ` Sebastien Carlier
@ 2010-11-04 10:54 ` Andreas Bießmann
2010-11-04 11:12 ` Sebastien Carlier
0 siblings, 1 reply; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-04 10:54 UTC (permalink / raw)
To: u-boot
Dear Sebastien Carlier,
Am 04.11.2010 04:27, schrieb Sebastien Carlier:
> These weakly defined empty functions prevent the strong definition
> from being linked in.
>
> For example, libarm.a contains a weak symbol 'red_LED_on', which is
> expected to be defined (strongly) in the board library. Because
> archive libraries are being used, this fails (testing with binutils
> 2.20.1), and only the empty __red_LED_on stub is linked in; the
> red_LED_on definition in the board library is throw away.
I have detected this issue yesterday evening too.
> This behavior is documented and it is the intended one; from
> http://www.sco.com/developers/gabi/latest/ch4.symtab.html:
>
>> When the link editor searches archive libraries [see ``Archive
>> File'' in Chapter 7], it extracts archive members that contain
>> definitions of undefined global symbols.
>> The member's definition may be either a global or a weak symbol.
>> The link editor does not extract archive members to resolve
>> undefined weak symbols. Unresolved weak symbols have a zero value.
>
> Empty weak definitions would have to be supplied to the linker only
> _after_ the strong definitions have been provided.
So it would be a work around to change Makefile from:
---8<---
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
--->8---
to:
--->8---
__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
---8<---
This could work cause in most cases the strong definitions are in
$(LIBBOARD) and overload the weak functions in $(LIBS).
But this is just a work around and will not fit any use-case of weak
functions. The root cause seems to be a linker problem. But I dunno
whether it is a mis-usage or a bug. Any gcc-guys here to comment?
> Leaving undefined weak symbols and testing for NULL-ity at call sites
> seems to be a more robust approach.
>
> Note that with some ld versions (at least with 2.20.1), ld creates PLT
> entries for undefined weak symbols and crashes when the PLT-related
> sections (.plt, .got.plt, and .rel.plt) are discarded...
This seems to be the main issue here ... but how to get it solved?
regards
Andreas Bie?mann
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board()
2010-11-04 10:54 ` Andreas Bießmann
@ 2010-11-04 11:12 ` Sebastien Carlier
0 siblings, 0 replies; 19+ messages in thread
From: Sebastien Carlier @ 2010-11-04 11:12 UTC (permalink / raw)
To: u-boot
On Thu, Nov 4, 2010 at 11:54 AM, Andreas Bie?mann
<andreas.devel@googlemail.com> wrote:
>
> --->8---
> __LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
> ---8<---
Still, why would the linker pull definitions from libboard.a? Library
archive are only searched by the linker to resolved undefined
definitions. Weak symbols do not count as undefined.
I think the following should work:
- In the u-boot code, forward declare (no 'weak' attribute) functions
which are to have a default implementation.
- Keep the linking order as it is now (main u-boot libs, then board
lib), and append a library containing all the weak definitions.
> But this is just a work around and will not fit any use-case of weak
> functions. The root cause seems to be a linker problem. But I dunno
> whether it is a mis-usage or a bug. Any gcc-guys here to comment?
I think the answer is that weak symbols are not meant to be used with
library archives. They work well with dynamic libraries.
>> Note that with some ld versions (at least with 2.20.1), ld creates PLT
>> entries for undefined weak symbols and crashes when the PLT-related
>> sections (.plt, .got.plt, and .rel.plt) are discarded...
>
> This seems to be the main issue here ... but how to get it solved?
I think there is no way around including the PLT. If I understand
well, weak symbols are meant to be resolved during dynamic linking, so
the extra indirection going through the PLT is needed to alter the
address of the weak symbols when dynamic objects are loaded.
--
Sebastien
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v3] arm920t: implement elf relocation
2010-11-04 10:15 ` Andreas Bießmann
@ 2010-11-04 12:37 ` Albert ARIBAUD
0 siblings, 0 replies; 19+ messages in thread
From: Albert ARIBAUD @ 2010-11-04 12:37 UTC (permalink / raw)
To: u-boot
Le 04/11/2010 11:15, Andreas Bie?mann a ?crit :
>> Can you give a specific case of board and toolchain that does not work?
> at91rm9200ek_ram_config (patch sent these days, is at91rm9200ek_config
> with TEXT_BASE in RAM and SKIP_LOWLEVEL_INIT set). Toolchain was a
> selfbuilt gcc-4.5.1 + binutils 2.20.1.20100303, can check CS 2010-q1
> this evening.
Thanks for the info. And yes please, check with a toolchain readily
available to all.
> regards
>
> Andreas Bie?mann
Amicalement,
--
Albert.
^ permalink raw reply [flat|nested] 19+ messages in thread
* [U-Boot] [PATCH v2 2/2] arm920t: implement elf relocation
[not found] ` <sebastien.carlier@2d91f447722561d137e769820c0e333bcce282ff>
@ 2010-11-20 11:48 ` Andreas Bießmann
0 siblings, 0 replies; 19+ messages in thread
From: Andreas Bießmann @ 2010-11-20 11:48 UTC (permalink / raw)
To: u-boot
Dear Sebastien,
sorry for being late, I was quite busy last days.
Am 18.11.2010 um 11:44 schrieb Sebastien Carlier:
> Dear Andreas,
>
> Could you please inform me of the status of your patch for ELF relocs
> for the arm920t?
I did some more changes to the posted patch. Mostely to address the 'do not fixup NULL pointer' mentioned by Joakim Tjernlund and to get a cleaner architecture (e.g. do not copy register content that often; before the decision if we need the fixup the original version does some unnecessary copies and on some other places also).
> I have been keeping my own version based on yours (see the attached
> patch based on u-boot/master) which has small fixes and cleanups and
> seems to run well here on an AT91RM9200.
Will have a look for your patch tomorrow (I'm still busy today ;(
Will send another version of my patch also tomorrow, maybe in the evening.
> U-Boot loads and relocates,
> but crashes later due to some problem with loading the initial
> environment because of a heap problem, which I am still investigating.
>
> I am not sure what to do with my patch. I had to copy your patch from
> an archive of the mailing list but this likely messed up whitespace.
> Can you please send me the latest version of your patch so that I can
> then send you a patch that applies cleanly on top of yours? Also, are
> you working against u-boot, or u-boot-arm?
Normally I work on top of u-boot. There where some changes these days so I will have to rebase and see whats happened.
regards
Andreas Bie?mann
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2010-11-20 11:48 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-31 7:11 [U-Boot] ARM: problems with elf relocation on arm920t / maybe toolchain related Andreas Bießmann
2010-10-31 7:25 ` [U-Boot] [PATCH RFC] arm920t: implement elf relocation Andreas Bießmann
2010-10-31 7:28 ` Albert ARIBAUD
2010-10-31 7:39 ` Andreas Bießmann
2010-10-31 7:49 ` Albert ARIBAUD
2010-11-03 23:21 ` [U-Boot] [PATCH v2 1/2] arm920t/at91/reset.c: fix weak reset_board() Andreas Bießmann
2010-11-04 1:00 ` Joakim Tjernlund
2010-11-04 1:13 ` Graeme Russ
2010-11-04 1:23 ` Joakim Tjernlund
2010-11-04 3:27 ` Sebastien Carlier
2010-11-04 10:54 ` Andreas Bießmann
2010-11-04 11:12 ` Sebastien Carlier
2010-11-04 10:41 ` Andreas Bießmann
2010-11-03 23:21 ` [U-Boot] [PATCH v2 2/2] arm920t: implement elf relocation Andreas Bießmann
2010-11-03 23:29 ` [U-Boot] [PATCH v3] " Andreas Bießmann
2010-11-04 6:14 ` Albert ARIBAUD
2010-11-04 10:15 ` Andreas Bießmann
2010-11-04 12:37 ` Albert ARIBAUD
[not found] ` <sebastien.carlier@2d91f447722561d137e769820c0e333bcce282ff>
2010-11-20 11:48 ` [U-Boot] [PATCH v2 2/2] " Andreas Bießmann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.