Comportement ambigu du segment .bss dans le programme C

J’ai écrit le programme simple C (test.c) ci-dessous: –

#include int main() { return 0; } 

et exécuté le suivant pour comprendre les changements de taille dans le segment .bss.

 gcc test.c -o test size test 

La sortie est sortie en tant que: –

  text data bss dec hex filename 1115 552 8 1675 68b test 

Je n’ai rien déclaré de manière globale ou statique. Veuillez donc expliquer pourquoi la taille du segment bss est de 8 octets.

J’ai fait le changement suivant: –

 #include int x; //declared global variable int main() { return 0; } 

Mais à ma grande surprise, le résultat était le même que précédemment: –

  text data bss dec hex filename 1115 552 8 1675 68b test 

S’il vous plaît, expliquez. J’ai ensuite initialisé le global: –

 #include int x=67; //initialized global variable int main() { return 0; } 

La taille du segment de données a augmenté comme prévu, mais je ne m’attendais pas à ce que la taille du segment bss soit réduite à 4 (au contraire à 8 lorsque rien n’a été déclaré). S’il vous plaît, expliquez.

 text data bss dec hex filename 1115 556 4 1675 68b test 

J’ai aussi essayé les commandes objdump et nm, mais elles ont également montré une variable x occupant .bss (dans le 2e cas). Cependant, aucun changement de taille bss n’est affiché lors de la commande size.

J’ai suivi la procédure selon: http://codingfox.com/10-7-memory-segments-code-data-bss/ où les sorties se déroulent parfaitement comme prévu.

Lorsque vous comstackz un programme main simple, vous liez également du code de démarrage. Ce code est responsable, entre autres choses, de init bss.

Ce code est le code qui “utilise” 8 octets que vous voyez dans la section .bss.

Vous pouvez supprimer ce code en utilisant l’option -nostartfiles gcc:

-nostartfiles

N’utilisez pas les fichiers de démarrage système standard lors de la liaison. Les bibliothèques système standard sont utilisées normalement sauf si -nostdlib ou -nodefaultlibs est utilisé

Pour faire un test, utilisez le code suivant

 #include int _start() { return 0; } 

et le comstackr avec

 gcc -nostartfiles test.c 

Vous verrez .bss réglé à 0

  text data bss dec hex filename 206 224 0 430 1ae test 

Vos deux premiers extraits sont identiques puisque vous n’utilisez pas la variable x .

Essaye ça

 #include volatile int x; int main() { x = 1; return 0; } 

et vous devriez voir un changement de taille .bss .

Veuillez noter que ces 4/8 octets sont quelque chose dans le code de démarrage. Ce qu’il est et pourquoi sa taille varie, n’est pas possible de le dire sans entrer dans tous les détails du code de démarrage mentionné.