[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