Go to a gnu mirror and get the latest binutils, gcc, and newlib sources. (replace the version numbers with what you download, for example binutils-2.15 instead of 2.14). This has been recently tested on Linux with gcc 3.4.0, binutils 2.15 and newlib 1.12.0 cd / mkdir arm cd arm mkdir bin PATH=/arm/bin:$PATH ZZZ='--target=arm-thumb-elf --prefix=/arm' tar xzvf binutils-2.14.tar.gz cd binutils-2.14 mkdir build cd build ../configure $ZZZ make all install cd /arm rm -r /arm/binutils-2.14 tar xzvf gcc-core-3.2.2.tar.gz tar xzvf newlib-1.11.0.tar.gz cd gcc-3.2.2 cp -r ../newlib-1.11.0/newlib/ . cp -r ../newlib-1.11.0/libgloss/ . rm -r /arm/newlib-1.11.0 edit gcc/Makefile.in and wipe out these definitions change from: STMP_FIXINC = @STMP_FIXINC@ to: STMP_FIXINC = change from: USE_COLLECT2 = collect2$(exeext) to: USE_COLLECT2 = cd newlib/libc/sys/arm rename or move crt0.S, libcfunc.c, and syscalls.c then touch them to make empty files touch crt0.S touch libcfunc.c touch syscalls.c cd /arm/gcc-3.2.2 mkdir build cd build ../configure $ZZZ --with-newlib (--disable-libmudflap --disable-libssp on gcc 4.1.2) make all install cd /arm save copies of crt0.S, libcfunc.c, and syscalls.c from /arm/gcc-3.2.2/newlib/libc/sys/arm/ rm -r /arm/gcc-3.2.2 And now you have a compiler/assembler/linker