[U-Boot] sparc leon3 linking problem
Tom Rini
trini at ti.com
Wed Mar 12 13:52:39 CET 2014
On Tue, Mar 11, 2014 at 03:14:26PM -0700, Kameron Larsen wrote:
> Hello,
>
> I'm bringing up a board based on the board/gaisler/gr_xc3s_1500/ design. To
> keep things simple, we can use this design exactly as is.
>
> My problem starts in the relocation section of arch/sparc/cpu/leon3/start.S
> which I'll paste here for convenience:
>
> /* un relocated start address of monitor */
> #define TEXT_START _text
>
> /* un relocated end address of monitor */
> #define DATA_END __init_end
>
> reloc:
> set TEXT_START,%g2
> set DATA_END,%g3
> set CONFIG_SYS_RELOC_MONITOR_BASE,%g4
> reloc_loop:
> ldd [%g2],%l0
> ldd [%g2+8],%l2
> std %l0,[%g4]
> std %l2,[%g4+8]
> inc 16,%g2
> subcc %g3,%g2,%g0
> bne reloc_loop
> inc 16,%g4
>
> As can be seen, this relies upon the location of the _text and __init_end
> symbols. These symbols are only known to the linker and should be filled in
> by the linker to point to the actual addresses within the compiled program.
> I can see these addresses by running an objdump -x on the final u-boot
> binary. The relevant portions are below:
>
> SYMBOL TABLE:
> 00000000 g .text 00000000 _text
> 00036000 g *ABS* 00000000 __init_end
>
> So 0x00000000, and 0x00036000 are the values I expect to be used for _text
> and __init_end respectively. However, looking at the disassembled u-boot
> binary (objdump -d), I see that they are not. Instead they are giving the
> values of 0xd50 and 0xd44:
>
> sparc-elf-objdump -d u-boot:
> 000010a4 <reloc>:
> 10a4: 05 00 00 03 sethi %hi(0xc00), %g2
> 10a8: 84 10 a1 50 or %g2, 0x150, %g2 ! d50
> <MINFRAME+0xcf4>
> 10ac: 07 00 00 03 sethi %hi(0xc00), %g3
> 10b0: 86 10 e1 44 or %g3, 0x144, %g3 ! d44
> <MINFRAME+0xce8>
> 10b4: 09 10 fe 38 sethi %hi(0x43f8e000), %g4
>
> 000010b8 <reloc_loop>:
> 10b8: e0 18 80 00 ldd [ %g2 ], %l0
> 10bc: e4 18 a0 08 ldd [ %g2 + 8 ], %l2
> 10c0: e0 39 00 00 std %l0, [ %g4 ]
> 10c4: e4 39 20 08 std %l2, [ %g4 + 8 ]
> 10c8: 84 00 a0 10 add %g2, 0x10, %g2
> 10cc: 80 a0 c0 02 cmp %g3, %g2
> 10d0: 12 bf ff fa bne 10b8 <reloc_loop>
> 10d4: 88 01 20 10 add %g4, 0x10, %g4
>
> FWIW, MINFRAME is the last declared variable in start.S before this reloc
> label.
>
> I've tried this with both the 3.4.4 and the 4.4.2 toolchains distributed by
> Gaisler. Both behave the same way.
>
> Why isn't ld filling in the correct values of linker symbols?
Any ideas Daniel? Thanks!
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140312/8acb7f99/attachment.pgp>
More information about the U-Boot
mailing list