8
votes

Que signifie "COM" dans la colonne NDX de la section .SymTab?

add2.c: xxx

compilation: gcc -c add2.c -o add2.o

lire la table des symboles: lookoose --symbols add2.o xxx

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.

merci


0 commentaires

3 Réponses :


2
votes

de Ce fichier PDF , table 7-11:

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.

Aussi, voir Cette page .


2 commentaires

Le lien vers PDF est maintenant mort.


@PIORZIERHOFFER: LINK FIXE.



0
votes

Ce sont des variables globales non initialisées allouées par la liaison. Parfois appelé variables communales.

Modifier: HRMM, Paul Baker m'a battu avec des liens sans moins. Utilisez sa réponse :)


0 commentaires

7
votes

GCC traite des globaux non initialisés qui ne sont pas explicitement déclarés externe comme des symboles "communs" (donc "com").

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.

En résumé, si vous avez, disons, deux définitions de int a :

  • int A; dans un objet et int A; dans un autre objet est ok: les deux se réfèrent à la même A , initialisé à 0
  • int a; dans un objet et int A = 42; dans un autre objet est ok: les deux se réfèrent à la même A , initialisé à 42
  • int A = 23; dans un objet et int A = 42; dans un autre objet donnera une erreur de liaison.

    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.)


1 commentaires

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 ?