Das ist auch recht speziell und avr-gcc-spezifisch.

Jede Funktion in C hat einen Prolog und einen Epilog. Diese Codestückchen werden nicht durch den C-Code des Programmierers erzeugt, sondern sie bereiten die eigentliche Funktionsausführung vor bzw. nach. Im Prolog wird z.B. ein Frame angelegt (falls benötigt) Register gesichert, etc. Im Epilog werden diese Register wieder hergestellt und zum Aufrufer zurückgesprungen (ret bzw. reti).

Der in den init-Sections befindliche Code wird von init0...init9 sequenziell durchlaufen, bevor main betreten wird. Legt man eine Funktion in eine dieser Sections, dann darf sie keine ret-Anweisung enthalten (wo sollte sie auch hin zurück??? sie wird ja nicht aufgerufen!). Dies erreicht man, indem man die Funktion naked macht.

Deshalb darf eine solche Funktion auch nicht auferufen weden: Sie hat kein ret und würde nicht wiederkehren, sondern irgendwo im Startup-Code loslegen und dann wieder in main landen...

Schau einfach mal ins list-File, dann wird's vielleicht klarer.