You've got an ARM chip, you want to use GCC, and this is your first excursion away from the land of IDEs and GUIs... What the hell does it take to make this work?? Good Question!
First off, you should know that IDEs are usually nothing more than a glorified front end for make. If you don't know how to use a Makefile, you should really learn, even if only because it'll make IDE-land easier for you.
What tools do you need? I don't know! But I can tell you what tools I use.
I use GNU ARM for my toolchain. It's got the C/C++ compilers, assembler, linker, object manipulation, etc.. and it comes packaged with the newlib library. If you're using Windows, you can use GNUARM with cygwin, or you can maybe use WinARM which I haven't used myself.
I also use openOCD for JTAG debugging and programming, and I use lpc21isp as a programmer for Phillips/NXP LPC series microcontrollers.
I use CuteCom for serial interfacing to target boards, but this isn't strictly necessary for programming/ARM development.
How do you do it?
Having the toolchain and knowing how to use it is the first part of the battle. I use "gcc" to compile my C sources and to turn them into objects. I use "as" for assembly files. I use "ld" in conjuction with a linker script to combine the objects into one big elf file. Then I use objcopy to create .hex files or .srec files, .bin files or whatever I want as output.
Does this sound nasty to you? For me, it's one command "make"
Think about what's actually involved in getting a processor up and running (go back to ECEN2120, for those of us who've been through ECE at CU Boulder). Basically, you need to setup the reset vector, along with the rest of the vector table. You need some initialization code to setup silly things like the stack and heap, copy variables to ram, initialize interrupts, etc. This is the "good stuff" that most IDEs hide from you... But it IS important to know what goes on here.
For ARM, I've got a stock assembly file that I use for initialization. It's got the vectors set up, it initializes data and bss, sets up the stack, and branches to main. It's not too hard. Once you're branching to main, you're pretty much back to IDE style programming.
What else do you need?
Malloc. You might not call malloc yourself, but chances are good that you use something else that calls it. Something like printf. If you dig into newlib, you'll find out that you need one file to make printf, scanf and malloc to work. This file is called "syscalls.c" and it has functions defined for "_write" "_read" and "_sbrk" which let printf, scanf, and malloc work. You'll need this. Watch out for reentrancy. If you use a newlib built to be reentrant, you'll need to use slightly different syscalls.c, which provides _sbrk_r, _write_r, _read_r.
Programming:
Getting the code from your computer to the target is another issue. If you're using an LPC series chip, you can use the in-system programming interface, and use lpc21isp. You can get an ISP programmer from Spark Fun or you can build the circuitry onto your board (if it's not there already).
openOCD is a bit more "involved". We'll be posting an openOCD howto.