Right this is what I did for my toolchain:
Get the one on which I was going to base it (for the headers, various libs and binutils)
I extracted this toolchain so that it sits in /usr/local/arm/3.3.2 (note that it won't work from here, it should be placed in /opt/cross I think - there's a readme in the parent dir, but this is where I wanted mine to end up.
Copy /usr/local/arm/3.3.2/arm-linux/sys-include to /usr/local/arm/3.3.2/sys-include (this is what GCC expects I think, or perhaps I just did it for the hell of it, can't remember)
Extract gcc-3.3.2.tar.gz somewhere, make a build dir which is not in the source tree as it recommends then use the following configure (alter the languages to your particular liking - read the /INSTALL/ files, it tells you quite a bit, including working out which are available):
../gcc-3.3.2/configure --disable-shared --enable-languages='c,c++,f77' --target=arm-linux --prefix='/usr/local/arm/3.3.2' --with-headers=/usr/local/arm/3.3.2/arm-linux/sys-include --with-libs=' '/usr/local/arm/3.3.2/arm-linux/lib /usr/local/arm/3.3.2/lib' '
After that finishes, make, then make install and there you go.
P.S. I'm sure I didn't need to specify everything as I did but it worked for me. A couple of things to note, use a fresh extract of GCC if it all goes wrong and you have to ./configure again. I don't think make distclean actually does what it says on the tin, probably also worth using a fresh
BTW for my toolchain this is what I use in my dev-arm-OZ.sh script:
export PATH CC CXX CCX CXXX COMPILER LINKER G77 F77
echo "Altered environment for OZ 3.3.2 Development"