Quelqu'un peut-il décrire ce qu'est une table de symboles dans le contexte du C et du C++ ?
Réponses
Trop de publicités?Il y a deux significations communes et liées des tableaux de symboles ici.
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. Ce fichier contient une collection de code exécutable et de données que l'éditeur de liens peut traiter pour en faire une application fonctionnelle ou une bibliothèque partagée. Le fichier objet contient une structure de données appelée table de symboles qui fait correspondre les différents éléments du fichier objet à des noms que l'éditeur de liens peut comprendre. Si vous appelez une fonction dans votre code, le compilateur ne place pas l'adresse finale de la routine dans le fichier objet. Au lieu de cela, il place une valeur de remplacement 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 de tous les fichiers objet qu'il traite et d'y coller l'emplacement final.
Ensuite, il y a aussi la table des symboles dans une bibliothèque partagée ou une DLL. Elle est produite par l'éditeur de liens et sert à nommer toutes les fonctions et les éléments de données qui sont visibles pour les utilisateurs de la bibliothèque. Cela permet au système d'effectuer la liaison au moment de l'exécution, en résolvant les références ouvertes à ces noms à l'endroit où la bibliothèque est chargée en mémoire.
Si vous voulez en savoir plus, je vous conseille l'excellent livre de John Levine intitulé "Linkers and Loaders". texte du lien
En bref, il s'agit de la correspondance entre le nom que vous attribuez à une variable et son adresse en mémoire, y compris les métadonnées comme le type, la portée et la taille. Il est utilisé par le compilateur.
C'est en général, pas seulement C[++]*. Techniquement, cela n'inclut pas toujours l'adresse mémoire directe. Cela dépend du langage, de la plate-forme, etc. que le compilateur cible.
Sous Linux, vous pouvez utiliser la commande :
nm [fichier d'objets]
pour lister la table des symboles de ce fichier objet. A partir de cette impression, vous pouvez alors déchiffrer les symboles de l'éditeur de liens en usage à partir de leur noms déformés .
Consultez le Tableau des symboles entrée wikipédia.