Le choix se "ferait" au niveau de la conception du compilateur ou du linker ?
Non, le choix se fait au niveau de la librairie C.
Il faut bien un mécanisme qui fixe la première fonction appellée au démarage d'un programme.
Oui, le vecteur de RESET.
Dans le fichier de lien on peut fixer l'adresse de certaines variables ou fonctions.
L'adresse des vecteurs d'interruption est fixée ainsi.
Le vecteur de reset contient l'adresse du startup.
Que le startup appelle main(), app_main() ou toto() importe peu.
main() est simplement un standard, une convention, mais cela dépend totalement de la librairie C.