8
votes

Où vont les variables mondiales non initialisées après l'initialisation?

J'ai frappé un petit problème lorsque j'apprends. Je sais que les variables globales ininitialisées en C sont affectées à la section .bbs dans le fichier ELF exécutable. Mais qu'est-ce qui leur arrive quand je commence à les utiliser? C'est à dire. ont-ils une place sur le tas ou ailleurs?

J'ai essayé de le savoir en imprimant l'adresse de la variable globale (toujours non initialisée) avec xxx

qui toujours Renvoie la même valeur 0x80495bc ... pourquoi?


2 commentaires

J'ai remarqué que vous avez accepté une réponse 5 minutes après la question. Vous aurez plus de réponses si vous le laissez ouvert pendant un certain temps, car les gens seront plus motivés pour améliorer les réponses.


Merci pour l'indice, je le ferai certainement la prochaine fois.


4 Réponses :


2
votes

Les variables globales obtiennent toujours une mémoire statique, si elles sont ininitialisées, elles n'ont pas de place dans le binaire, mais elles l'obtiennent en mémoire lorsque le binaire est chargé dans l'espace mémoire de processus.


0 commentaires

1
votes

Le BSS est un espace réservé défini dans votre format exécutable (ou ELF). Donc, il ne prend pas d'espace disque, mais spécifie uniquement la région de la mémoire doit être allouée par la liaison ou le chargeur.

L'opération exacte dépend du système d'exploitation. Depuis que vous vous référez à Elf, je suppose que c'est destiné à être utilisé dans un système intégré. Si vous construisez un code recherché, votre fichier CMD de liaison mappera le BSS dans une région d'adresse statique.

Si vous construirez pour un système d'exploitation (c.-à-d. Linux), le chargeur du système d'exploitation effectuera une passe de relocalisation, dans laquelle il mesure tous les emplacements marqués comme relatif au format excacuable aux emplacements physiques ou logiques de la mémoire. < / p>

Parce que vous mentionnez toujours la même valeur, cela indique que le processus est répétable pour votre système. Attendez-vous à voir des modifications lorsque vous modifiez des fichiers de liaison (c'est-à-dire des régions d'adresses), la commande de liaison (c'est-à-dire que vous obtiendrez l'espace attribué dans un ordre différent) ou un système d'exploitation.

sidether ou non, vous utilisez les valeurs BSS, l'adresse restera la même pour le processus que vous exécutez.


0 commentaires

8
votes

Lorsque le système d'exploitation charge votre programme, il attribue suffisamment de stockage de l'espace d'adressage de votre programme pour tout stocker dans la section .bss et les zéros de toute cette mémoire. Lorsque vous affectez ou lisez ou prenez l'adresse de la variable, vous manipulez cette mémoire allouée pour fournir un stockage pour la section .bbs.


2 commentaires

Ah et cela explique également pourquoi la valeur contenue par la variable globale non initialisée était toujours nulle. Merci!


Certains compilateurs / architectures prennent en charge une section SBSS pour de petites données. Ceci est souvent fait comme une optimisation de sorte que les données puissent être récupérées par indexation du début de la section SBSS. Cela peut souvent être fait en utilisant le registre GP et l'indexation de 16 bits



1
votes

Cette section BSS reçoit un bloc de mémoire dans l'espace d'adressage de processus, comme le code et les sections de pile (et tout autre elfe peut avoir). Une fois là-bas, ils ne vont n'importe où. Le chargeur organise des choses alors appelle le point d'entrée de processus.


0 commentaires