Sasume (./1) :
Quand TIGCC produit des sections BSS dans les programmes _nostub, elles sont initialisées dans le code de démarrage ?
Par défaut, oui, mais c'est désactivable (cf. les options du projet), mais dans ce cas leur contenu initial sera n'importe quoi étant donné qu'elles sont allouées en temps d'exécution.
De l’espace est alloué sur le tas ?
Oui.
Du coup il faut que le code de démarrage reloge les références aux variables de la section BSS ?
Oui.
Pourquoi seules les variables non initialisées vont en section BSS ?
Parce que la section n'est pas stockée dans le programme, donc il n'y a pas d'initialisateurs.
Quelles sont les différentes conditions à remplir pour partir en section BSS ?
Variable globale ou statique non initialisée, BSS activé dans le compilateur (non-utilisation de
-mno-bss) et dans le linker (non-utilisation de
MERGE_BSS), version suffisamment récente de TIGCC.
Sasume (./2) :
Bonus (question super conne) : c’est quoi l’avantage de la section BSS ?
On évite de se trimballer des kilooctets de zéros si on a de gros tableaux globaux.
PpHd (./9) :
Valoir 0.
Condition non suffisante, à moins d'utiliser
-fzero-initalized-in-bss (qui est désactivé par défaut dans TIGCC pour des raisons de compatibilité et pour permettre de désigner une variable comme non-BSS pour éviter les relogements).
Ironiquement, ça veut dire que:
int toto;vaudra toujours zéro au démarrage (parce que c'est dans la section BSS qui est initialisée au démarrage du programme) alors que:
int toto=0;non! (Il garde la dernière valeur si le programme n'est ni archivé ni compressé.) C'est subtil, quoi.
PpHd (./13) :
Ca, c'est un bug connu. Pas une feature.
Non, cette option est une feature de
ld-tigcc, mais ce n'est pas sans raison que le choix par défaut est d'initialiser le BSS (c'est ce que demande le standard C, entre autre).