[U-Boot] sparc leon3 linking problem
Kameron Larsen
kroylar at gmail.com
Tue Mar 11 23:14:26 CET 2014
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?
-Kameron
More information about the U-Boot
mailing list