Hi All
I think I have found a linker bug!
I use the following cross compilers from sgi's ftp:
binutils-mips64-linux-2.9.5-3.i386.rpm
egcs-mips64-linux-1.1.2-4.i386.rpm
binutils-mips64el-linux-2.9.5-3.i386.rpm
egcs-mips64el-linux-1.1.2-4.i386.rpm
Anyway the bug is that static functions get linked wrongly.
Test program:
---------------------
/* This function has to be here to get the error */
int test1(void) {
return 1;
}
static int test2(void) { /* <---- notice this static */
return 2;
}
int main() {
test2();
return 1;
}
---------------------
Compile and link with:
mips64-linux-gcc -mcpu=r4600 -mabi=64 -mips3 -g -c -O2 -o main.o main.c
mips64-linux-ld -m elf64btsmip -nostdlib -e main main.o -o main.elf
Now I see the bug where main calls test2:
Doing a 'mips64-linux-objdump -S test.elf' gives me:
main.elf: file format elf64-bigmips
Disassembly of section .text:
00000000100000f0 <test1>:
return 1;
100000f0: 03e00008 jr $ra
100000f4: 24020001 li $v0,1
00000000100000f8 <test2>:
}
static int test2(void) {
return 2;
100000f8: 03e00008 jr $ra
100000fc: 24020002 li $v0,2
0000000010000100 <main>:
}
int main() {
10000100: 67bdfff0 0x67bdfff0
10000104: ffbf0000 0xffbf0000
0000000010000108 <$LM6>:
test2();
10000108: 0c000044 jal 10000110 <$LM7> <-- 110 ????????????
1000010c: 00000000 nop
0000000010000110 <$LM7>:
return 1;
10000110: dfbf0000 0xdfbf0000
10000114: 24020001 li $v0,1
10000118: 03e00008 jr $ra
1000011c: 67bd0010 0x67bd0010
When removing the static I get the correct address 100000f8 ?!?
Am I missing something. Please help me, I have spend 3 days
chasing this bug, until I figures out it was related to
static functions.
btw why isn't everything disassembled?
Thanks
Lars Munch
|