Den Compiler selbst geht das überhaupt nichts an. Der schiebt seine
"const" Daten nach ".rodata" und die Sache hat sich für ihn. Ob das im
Flash liegt, im RAM oder in externem DRAM ist ihm dabei völlig wurscht.
Der Compiler weiss nicht einmal, ob der Controller überhaupt Flash hat.
Erst Linker-Script und Startup-Code bestimmen was damit passiert. Oft
wird man bei ARMs mit Code im Flash auch die RO-Daten dorthin legen.
Aber da bei Prozessoren ohne Cache der Zugriff auf Flash langsamer als
RAM ist kann man das ggf. auch anders halten und den Linker so
dirigieren, dass er diese Section im RAM platziert und der Startup-Code
den Inhalt zusammen mit den normalen initialisierten Daten aus dem Flash
dorthin kopiert.
Es gibt also keine einfache Antwort darauf (bei AVRs gibt es die, aber
da ist das von der Architektur vorgegeben). Schon garnicht, wenn nur
"GCC" in der Frage steht, nicht aber die konkrete Entwicklungsumgebung.
Bei fertigen Compiler-Paketen wie Keil, Crossworks usw. wird man
abhängig vom exakten Zielprozessor und dem Debugging-Modus eine
bestimmte vorgesehene Verhaltensweise finden. Bei Bausätzen wie
CodeSourcery und Yagarto, in denen der Anwender Linker-Script und
Startup-Code ohnehin selbst definiert, ist alles offen.
Oft findet man optionale Szenarien für Debugging im RAM. Bei diesen ist
alles im RAM, ob "const" oder nicht. In anderen Szenarien sind "const"
Daten dann evtl. im Flash. Beim gleichen Compiler, beim gleichen
Zielcontroller.
Klar ist nur, dass eine explizite Attributierung als .rodata genau das
herstellt, was der Compiler von sich aus sowieso schon tut. Und damit
keineswegs sichergestellt ist, dass diese Daten im Flash landen.