Qu'est-ce qu'une table de symboles?

88

Quelqu'un peut-il décrire ce qu'est une table de symboles dans le contexte de C et C ++?

jdt141
la source

Réponses:

82

Il existe ici deux significations communes et liées des tables de symboles.

Tout d'abord, il y a la table des symboles dans vos fichiers objets. Habituellement, un compilateur C ou C ++ compile un seul fichier source dans un fichier objet avec une extension .obj ou .o. Il contient une collection de code exécutable et de données que l'éditeur de liens peut traiter dans une application de travail ou une bibliothèque partagée. Le fichier objet contient une structure de données appelée table de symboles qui mappe les différents éléments du fichier objet à des noms que l'éditeur de liens peut comprendre. Si vous appelez une fonction à partir de votre code, le compilateur ne met pas l'adresse finale de la routine dans le fichier objet. Au lieu de cela, il met une valeur d'espace réservé dans le code et ajoute une note qui indique à l'éditeur de liens de rechercher la référence dans les différentes tables de symboles à partir de tous les fichiers objets qu'il traite et d'y coller l'emplacement final.

Deuxièmement, il y a aussi la table des symboles dans une bibliothèque partagée ou une DLL. Ceci est produit par l'éditeur de liens et sert à nommer toutes les fonctions et éléments de données visibles par les utilisateurs de la bibliothèque. Cela permet au système d'effectuer des liaisons au moment de l'exécution, en résolvant les références ouvertes à ces noms vers l'emplacement où la bibliothèque est chargée en mémoire.

Si vous voulez en savoir plus, je vous suggère l'excellent livre de John Levine "Linkers and Loaders". texte du lien

Ben Combee
la source
Salut Ben, dans le second cas, tu parles du tableau d'exportation? Autrement dit, la table d'exportation est-elle un cas particulier de la table de symboles? Ou s'agit-il de concepts non liés?
Pooven
Salut. Je crois que ce n'est pas dans un fichier objet mais référé à partir d'eux. Deuxièmement, pourriez-vous expliquer un peu plus ce que vous entendez par «emplacement final»? Adresse physique ou adresse relative finalisée dans le code source.
stdout
La seconde que vous mentionnez est-elle une référence à la branche ou à la table d'appel?
Nikos
26

En bref, c'est le mappage du nom que vous attribuez à une variable à son adresse en mémoire, y compris des métadonnées telles que le type, la portée et la taille. Il est utilisé par le compilateur.

C'est en général, pas seulement C [++] *. Techniquement, il n'inclut pas toujours l'adresse mémoire directe. Cela dépend de la langue, de la plate-forme, etc. ciblée par le compilateur.

Steve Landey
la source
Je pense qu'il était très important que vous mentionniez le contenu de l'adresse en disant "elle n'inclut pas toujours l'adresse mémoire directe".
stdout
13

Sous Linux, vous pouvez utiliser la commande:

nm [fichier objet]

pour lister la table des symboles de ce fichier objet. À partir de cette impression, vous pouvez ensuite déchiffrer les symboles de l'éditeur de liens en cours d'utilisation à partir de leur noms mutilés .

ZeHolyQofPower
la source
8

Le tableau des symboles est la liste des «symboles» dans un programme / une unité. Les symboles sont le plus souvent les noms de variables ou de fonctions. La table des symboles peut être utilisée pour déterminer où dans la mémoire les variables ou les fonctions seront situées.

Joe Schneider
la source
0

La table de symboles est une structure de données importante créée et maintenue par des compilateurs afin de stocker des informations sur l'occurrence de diverses entités telles que des noms de variables, des noms de fonctions, des objets, des classes, des interfaces, etc.

éruptions cutanées
la source
Les éditeurs de liens et les assembleurs traitent également des tables de symboles (souvent plus simples que celles du compilateur).
Basile Starynkevitch