add2.c: compilation:
gcc -c add2.c -o add2.o p> lire la table des symboles:
lookoose --symbols add2.o p> Que signifie "COM" dans la colonne NDX? Je comprends que "compteur" et "A" sont définis dans la section n ° 3 (c.-à-d. .Bbs) et que "Ajouter" est définie dans la section n ° 1 (c.-à-d ..text), mais je m'attendais à "B" et "C" doit être défini dans la section .bbss aussi, puis obtenir un "3" dans la colonne NDX. P> merci p> p> p> p>
3 Réponses :
de Ce fichier PDF , table 7-11: P>
shn_common
Symboles défini par rapport à Cette section sont des symboles communs, tels que comme moyen commun ou non alloué c variables externes. Ces symboles sont parfois appelé provisoire. p> blockQuote>Aussi, voir Cette page . P>
Le lien vers PDF est maintenant mort.
@PIORZIERHOFFER: LINK FIXE.
Ce sont des variables globales non initialisées allouées par la liaison. Parfois appelé variables communales. P>
Modifier: HRMM, Paul Baker m'a battu avec des liens sans moins. Utilisez sa réponse :) P>
GCC traite des globaux non initialisés qui ne sont pas explicitement déclarés Les définitions multiples du même symbole commun (sur plusieurs fichiers d'objets) sont fusionnées par la liaison lors de la création de l'exécutable final, de sorte qu'ils se réfèrent tous au même stockage. L'un des fichiers d'objets peut l'initier à une valeur particulière (auquel cas cela se retrouvera dans la section de données); Si aucun fichier d'objet initialise, cela se retrouvera dans la BSS; Si plus d'un objet initialise, vous obtiendrez une erreur de liaison. P>
En résumé, si vous avez, disons, deux définitions de Notez que l'utilisation de plusieurs définitions du même symbole sur deux objets n'est pas techniquement autorisée par la norme C; Mais il est soutenu par de nombreux compilateurs, y compris GCC, comme extension. (Il est répertorié sous "Extensions communes" - aucun jeu de mots destiné - dans la spécification C99.) P> externe code> comme des symboles "communs" (donc "com"). P>
int a code>: p>
int A; code> dans un objet et
int A; code> dans un autre objet est ok: les deux se réfèrent à la même
A code>, initialisé à 0 li>
int a; code> dans un objet et
int A = 42; code> dans un autre objet est ok: les deux se réfèrent à la même
A code>, initialisé à 42 li>
int A = 23; code> dans un objet et
int A = 42; code> dans un autre objet donnera une erreur de liaison. LI>
ul>
D'accord ! Je comprends que nous ne pouvons pas maintenant où un symbole "commun" finira par regarder un fichier objet relocatifable. Ceci est décidé par la liaison, au moment de la liaison, en fonction des autres fichiers d'objet relocatifs avec ce symbole. Est ce bien ?