Hier ein Beispiel, was mein Makefile aufruft (ist allerdings für einen ARM-Controller, was anderes hab ich gerade nicht da):
CFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft \
-ffunction-sections -fdata-sections -fno-common -g -std=gnu99 -Wall -Wextra -Os -I.
LFLAGS = -static -nostartfiles -lc -lgcc -specs=nano.specs -Wl,--gc-sections
# kompilieren
arm-none-eabi-gcc $(CFLAGS) -c -o startup.o startup.c
arm-none-eabi-gcc $(CFLAGS) -c -o syscalls.o syscalls.c
arm-none-eabi-gcc $(CFLAGS) -c -o main.o main.c
arm-none-eabi-gcc $(CFLAGS) -c -o uart.o uart.c
arm-none-eabi-gcc $(CFLAGS) -c -o display.o display.c
# linken
arm-none-eabi-gcc -Tlm3s811.ld $(CFLAGS) $(LFLAGS) -o main.elf startup.o syscalls.o main.o uart.o display.o
Ich benutze gcc also sowohl für das Kompilieren der einzelnen C-Dateien (übrigens auch für das Assemblieren der S-Dateien), als auch für das Linken der Objekte zum Endergebnis.
Da ich kein Windows benutze, kann ich dir leider nicht sagen, was die beste Toolchain (oder welche Version) dafür ist. Aber es kann gut sein, dass das ein Fehler (oder eine Eigenheit) von DJGPP ist. Am Anfang spielt die Toolchain keine große Rolle, später solltest du sowieso auf einen Crosscompiler umsteigen. Ich benutze Linux und würde dir eine virtuelle Maschine empfehlen, aber MinGW oder Cygwin sollten's auch tun.
Gruß,
Svenska