Hi all,
First off Hello! My first post on the list so *wave*.
I've got something going on where I'm not sure if I'm missing a
subtlety (likely) or if something bizarre is going on. I'm building a
hacked variant of kernel 2.6.29.6 that's come from somone who's ported
it to the particular board I'm using. I've built a working kernel but
I'm not sure what's going on when I try to boot it as it seems like
the objcopy to make a binary image from vmlinux is a bit odd... To
walk through what I'm doing :
This kernel is compiled with a load address of 0x80500000. Looking at
vmlinux to find kernel_entry :
$ mipsel-percello-linux-gnu-nm ../../../vmlinux | grep kernel_entry
80504590 T kernel_entry
Checking via GDB to see what the code looks like :
(gdb) disassemble kernel_entry
Dump of assembler code for function kernel_entry:
0x80504590 <kernel_entry+0>: add %ah,0x8(%eax)
0x80504593 <kernel_entry+3>: inc %eax
0x80504594 <kernel_entry+4>: add %dl,(%eax)
0x80504596 <kernel_entry+6>: add %edi,(%edi,%ebx,1)
0x80504599 <kernel_entry+9>: add %ah,(%ecx)
0x8050459b <kernel_entry+11>: xor $0x25,%al
So it's where we expected it to be from the output of nm... :
(gdb) x/90xw 0x80504590
0x80504590 <kernel_entry>: 0x40086000 0x3c011000 0x3421001f
0x01014025
0x805045a0 <kernel_entry+16>: 0x3908001f 0x40886000 0x000000c0
0x3c088050
I then convert this vmlinux file to a binary image :
$ mipsel-percello-linux-gnu-objcopy -O binary ./vmlinux ./vmlinux.bin.test
and then hexdump to see what's at the kernel_entry offset :
$ xxd -g xxd -g 4 -s 0x4550 -l 0x80 ./vmlinux.bin.test
0004550: 00600840 0010013c 1f002134 25400101 .`.@...<..!4%@..
0004560: 1f000839 00608840 c0000000 5080083c ...9.`.@....P..<
0004570: bc450825 08000001 00000000 9c80083c .E.%...........<
0004580: 00700825 000000ad a180093c dcb22925 .p.%.......<..)%
0004590: 04000825 feff0915 000000ad 9c80013c ...%...........<
00045a0: 647624ac 9c80013c 687625ac 9c80013c dv$....<hv%....<
00045b0: 6c7626ac 9c80013c 707627ac 00208040 lv&....<pv'.. .@
00045c0: 96801c3c 00609c27 e01f1d24 21e8bc03 ...<.`.'...$!...
The code for kernel_entry seems to be at an offset of 0x0004550. This
is -0x40 bytes below where I'd expected! Am I missing something? I can
confirm this by using my bootloader to load vmlinux.bin a
(load_address + 0x40) and it runs just fine.
The toolchain we have is :
binutils 2.16.1
gcc 4.2.0
Any insight would be appreciated!
Cheers!
~Pev
|