Theoretisch kann ein Startup-Code entfallen, da der M3 keine festen Interruptsprungadressen mehr hat, sondern direkt an die Adressen im Interruptcontroller springt. Den wiederum kann man in C konfigurieren und das ram und stack initialisieren kann man auch aus C raus machen, wenn man das mit entsprechendem __attribute an entsprechende Adressen linkt.
Daher wäre es generell denkbar, auf einen Startup-code zu verzichten, wobei ich es nicht gut finden würde.

Ich kanns nur nochmal sagen; Dein Problem liegt irgendwo beim Linkerscript (bzw.Startup-Code) begraben!
Das Makefile sorgt nur dafür dass alles entsprechend deinen Vorstellungen compiliert und gelinkt wird.
Ich habe das Gefühl du verstehst nicht, was diese einzelnen Dateien machen. Was das Makefile angeht, kannst du dir da Abhilfe schaffen, indem du dir einfach mal durchliest, was ein Makefile ist und wie es funktioniert (was ich jetzt schon x mal gesagt habe).
Was Linkerscripts und startups angeht möchte ich für einen groben Überblick auf das Tutorial weiter oben verweisen.

Wenn man mit ARMs rumexperimentiert ist leider nichtmehr alles so schön einfach mit einem Klick auf "Build project" erledigt. Bis mein erstes ARM-Projekt funktioniert hat, hats seine 3 Monate gebraucht...
Da muss man sich halt einarbeiten, ich sags echt ungern, aber vor ARM kommt leider RTFM...