Qu'est-ce que Section BSS ?

Zone des variables globales et statiques sans valeur initiale (ou initialisées à 0). Seule sa taille est enregistrée dans le fichier, la zone étant remplie de 0 au chargement, ce qui n'alourdit pas l'exécutable.

Nom japonais: BSSセクション

Domaine: Éditeurs de liens, chargeurs et exécutables

Ce qui se retrouve dans .bss

Le langage C impose que tout objet à durée de stockage statique, c'est-à-dire les variables globales et static, commence à zéro si aucun initialiseur n'est fourni. Les compilateurs placent ces variables, et généralement aussi celles explicitement initialisées à 0, dans la section .bss. Les globales à valeur initiale non nulle vont dans .data, et les constantes qualifiées const dans la section en lecture seule .rodata. Le mot-clé static ne choisit pas la section ; il limite seulement la visibilité à un fichier. Les variables locales automatiques n'apparaissent jamais dans .bss, car elles résident sur la pile et n'ont pas de valeur initiale définie.

Pourquoi .bss n'occupe pas de place dans le fichier

Stocker une longue suite de zéros dans l'exécutable ne ferait que gaspiller de l'espace disque et du temps de chargement ; la section .bss n'enregistre donc que sa taille et son alignement. Dans ELF, elle est marquée comme n'occupant aucun octet du fichier. Le chargeur projette le segment lecture-écriture contenant .data et .bss, et lorsque la taille mémoire du segment dépasse sa taille dans le fichier, les octets supplémentaires sont fournis sous forme de pages remplies de zéros. Ainsi, une déclaration comme static char buf[1000000]; ajoute environ 1 Mo à l'occupation mémoire, mais presque rien au fichier.

BSS dans les systèmes embarqués

Sur un microcontrôleur sans système d'exploitation, personne d'autre ne remplit la mémoire de zéros ; c'est donc le code de démarrage qui s'en charge. Avant d'appeler main, le gestionnaire de reset copie généralement les valeurs initiales de .data depuis la flash vers la RAM et efface la plage .bss en RAM, à l'aide des adresses de début et de fin que le script d'édition de liens exporte sous forme de symboles. Oublier l'une de ces étapes laisse des variables globales avec des valeurs aléatoires. Des outils comme la commande size indiquent séparément text, data et bss, ce qui aide à estimer l'occupation de la flash et de la RAM.

L'origine du nom

BSS se développe couramment en block started by symbol, un nom hérité d'une directive d'assembleur des premiers mainframes IBM qui réservait, sous une étiquette, un bloc de stockage non initialisé. Ce sens a survécu dans les formats objets Unix puis dans ELF, bien que la directive elle-même ait disparu depuis longtemps. Aujourd'hui, le nom désigne simplement la section des données initialisées à zéro, à côté de .text pour le code, .data pour les données initialisées et .rodata pour les constantes.

Questions fréquentes

Que signifie BSS ?

BSS se développe généralement en block started by symbol, d'après une ancienne directive d'assembleur. Dans les chaînes d'outils modernes, il désigne simplement la section des variables globales et static initialisées à zéro.

Un grand tableau non initialisé rend-il l'exécutable plus gros ?

Non. Un tableau global ou static sans initialiseur va dans .bss, où seule sa taille est enregistrée ; la mémoire est allouée et remplie de zéros au chargement du programme.

Quelle est la différence entre .data et .bss ?

La section .data contient les globales et static à valeur initiale non nulle, qui doivent être stockées dans le fichier. La section .bss contient celles qui commencent à zéro : elle occupe de la mémoire à l'exécution, mais aucune place pour un contenu dans le fichier.

Termes associés

ASLR Bibliothèque partagée Bibliothèque statique Chargeur (loader) Code indépendant de la position Décoration de noms (name mangling) Éditeur de liens (linker) Éditeur de liens dynamique Édition de liens dynamique Édition de liens statique

Retour au glossaire