I have a problem that my huge dynamically linked program cause SIGSEGV or SIGBUS immediately after running from main() on mips-linux. Digging into this problem, I found that GOT entries are corrupted. Here are some informations from readelf and objdump: $ mips-linux-readelf -a myapp ... Relocation section '.rel.dyn' at offset 0xe3b20 contains 426 entries: Offset Info Type Sym.Value Sym. Name ... 100c47bc 003f7f03 R_MIPS_REL32 004e4990 getrlimit ... Symbol table '.dynsym' contains 17742 entries: Num: Value Size Type Bind Vis Ndx Name ... 16255: 004e4990 0 FUNC GLOBAL DEFAULT UND getrlimit ... Symbol table '.symtab' contains 26849 entries: Num: Value Size Type Bind Vis Ndx Name ... 7664: 004e4990 0 FUNC GLOBAL DEFAULT UND getrlimit ... $ mips-linux-objdump -s -j .got myapp ... Contents of section .got: ... 100c47b0 100c5cba 00c07c54 100c5c5c 004e4990 ..\...|T..\\.NI. ... 0x004e4990 is "stub" routine to jump into libc's getrlimit. 0x100c47bc must contain 0x004e4990 at run-time, but when the signal sent the value is 0x009c9320. It is 0x004e4990+0x004e4990. The outout from objdump shows 0x004e4990 is already in .got and the output from readelf shows 0x004e4990 will be added to it by dynamic loader. Is my understanding right? Could anyone tell me why binutils generate such informations? Or is this dynamic loader issue? I'm using binutils 2.14, gcc-3.3.2, glibc-2.2.5. I tried gcc-3.3.1, glibc-2.3.2, uClibc-0.9.21, binutils-2.14.90.0.6 and binutils-cvs but no lock. My program is huge enough so that older binutils causes "relocation truncated to fit" error. The program can work well if statically linked. Other (relatively small) dynamically linked programs can work well also. Thanks. --- Atsushi Nemoto