jkp@SAUNA.HUT.FI (Jyrki Kuoppala) (06/09/89)
Using the latest GNU ld on a sparc machine with the GNU linker configured for a m68k target machine: (gdb) r /usr/ressu/users/jkp/gcc-68k/gcc-crt0.o /usr/ressu/users/jkp/foo.o -lc Starting program: /usr/ressu/users/jkp/tmp/bu/ld /usr/ressu/users/jkp/gcc-68k/gcc-crt0.o /usr/ressu/users/jkp/foo.o -lc Program received signal 10, Bus error Reading in symbols for ld.c...done. perform_relocation (data=(char *) 0xfefff898 "#\300", pc_relocation=0, data_size=60, reloc_info=(struct relocation_info *) 0xfefff870, reloc_size=32, entry=(struct file_entry *) 0x1a7e8) (ld.c line 3981) (gdb) This is in the code in the following place: break; case 2: if (RELOC_MEMORY_ADD_P(p)) => relocation += mask & *(long *) (data + addr); *(long *) (data + addr) &= ~mask; *(long *) (data + addr) |= relocation; break; default: fatal_with_file ("Unimplemented relocation field length in ", entry); Some variables: (gdb) print data $1 = (char *) 0xfefff898 "#\300" (gdb) print addr $2 = 2 (gdb) print mask $3 = 4294967295 (gdb) print relocation $4 = 8132 (gdb) So, it seems that on a Sparc you can't read a long except from a longword-aligned address and on this cross-development configuration alignment this would be needed. All the programs were compiled with gcc 1.35. I can provide more information if that's needed. //Jyrki