Here are some details that I missed off my original post: The GCC version is 3.3.2, and is hosted on Sun/Solaris (version 5.8). My linker script is like this: /*======================================================================== | armada linker command file ======================================================================== | | Description: | This is the linker command file for armada | | Revisions: | 10/10'03 ICH initial armada setups | ========================================================================*/ /* OUTPUT_FORMAT("elf32-bigmips", "elf-bigmips", "elf-littlemips") */ OUTPUT_ARCH(mips) /**** Start point ****/ ENTRY(start) SECTIONS { .text 0xA0100000 : { *(.text) *(.gnu.linkonce.t*) _ecode = ABSOLUTE(.) ; /* End of code */ *(.rodata) *(.gnu.linkonce.r*) . = ALIGN(8); _etext = ABSOLUTE(.); /* End of code and read-only data */ } /**** Initialised data ****/ .data : { _fdata = ABSOLUTE(.); /* Start of initialised data */ *(.data) . = ALIGN(8); _gp = ABSOLUTE(. + 0x7ff0); /* point at middle (32Kbytes) of 64Kbyte initialized data */ *(.lit8) *(.lit4) *(.ctors) *(.dtors) *(.got.plt) *(.got) *(.dynamic) *(.sdata) *(.gnu.linkonce.s*) . = ALIGN(8); _edata = ABSOLUTE(.); /* End of initialised data */ } /**** Uninitialised data ****/ _fbss = .; /* Start of unitialised data */ .sbss : { *(.sbss) *(.scommon) } .bss : { *(.bss) *(COMMON) } _end = . ; /* End of unitialised data */ .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } /DISCARD/ : { *(.reginfo) } PROVIDE(etext = _etext); PROVIDE (edata = .); PROVIDE (end = .); PROVIDE (__stacktop = 0xa02fff00); }