7
votes

Quelle est la résolution des symboles?

Cela semble être l'une de ces choses que chaque discussion ne fait que définir ... Je n'arrive pas à trouver des informations sur ce sujet. Quelle est la résolution des symboles? C'est la meilleure chose que j'ai trouvée: http://docs.oracle.com/cd/e23824_01/html/819-0690/Chapter2-90421.html#chapter2-93321

a-t-il quelque chose à voir avec la compilation de votre programme?


0 commentaires

3 Réponses :


10
votes

Eh bien, maintenant que vous mentionnez NM de Unix, je peux identifier la résolution du symbole.

Les fichiers exécutables peuvent faire référence aux entités qui ne sont pas définies à l'intérieur d'eux-mêmes. Par exemple, variables ou procédures sur les bibliothèques partagées. Ces entités sont identifiées par des symboles externes. L'exécutable peut aussi bien avoir des symboles internes pouvant être référencés par des fichiers externes - comme c'est le cas, bien sûr des bibliothèques.

La résolution des symboles, dans ce contexte, est, une fois qu'un programme a été chargé en mémoire, attribuant des adresses appropriées à toutes les entités externes qu'il fait référence. Cela signifie changer de position dans le programme chargé où une référence à un symbole externe a été faite.

Ces adresses dépendront de l'endroit où, dans la mémoire, le code avec les symboles externes a été chargé.

in Unix, le mode de compilation par défaut pour les programmes consiste à utiliser la bibliothèque partagée Systèmes, au lieu de pré-relier tout nécessaire dans l'exécutable. Lors de la compilation d'un programme avec GCC , par exemple, vous passez le drapeau -static si vous souhaitez que ce soit compilé de manière statique, au lieu d'avoir des références symboliques non résolues.

Recherchez "Bibliothèques partagées" pour plus d'informations.


2 commentaires

A du sens, merci beaucoup. Je vais rechercher des "bibliothèques partagées" aussi. Avez-vous des livres que vous pourriez vous recommander d'en apprendre davantage à ce sujet?


Le meilleur livre que je connaisse sur le sujet est lieurs et chargeurs par John R. Levine .



1
votes

Je ne suis pas sûr du contexte que vous entendez une résolution de symboles. Mais cela me rappelle Dlopen (3) et DLSYM (3) pour la résolution de symboles d'exécution dans les bibliothèques partagées.


1 commentaires

Je veux dire dans le contexte de l'utiliser avec la commande NM sur UNIX. Est ce que ça aide? Je ne suis pas sûr de ce que Dlopen est non plus, alors je ne peux pas dire si vous êtes proche.



2
votes

Comme mentionné, il peut se référer à la résolution de symboles de temps d'exécution ou de liaison. Cependant, vous ne devriez pas oublier la résolution de symboles de compilation em>.

Il s'agit des règles d'une langue utilisée pour mapper des symboles vers "les choses". Les symboles étant à peu près tout ce qui ressemble à un nom (local, membres et variables globales, fonctions, méthodes, types, etc.) et «choses» étant les compilateurs de compilation de ce que le nom se réfère. P>

Le Les règles de fonctionnement peuvent être assez simples (par exemple, IIRC dans C, il est guère plus qu'une liste ordonnée d'endroits à regarder) ou complexe (C ++ a toutes sortes de cas de surcharge, de modèles et de ce que ce soit). Généralement, ces règles interagissent avec la sémantique du programme et peuvent parfois avoir même des ambiguïtés (potentiellement) des ambiguïtés: p>

C ++: P>

int First(int i) { return i; }
float First(float f) { return f; }

void Second(int (*fn)(int)) { printf("int"); }
void Second(float (*fn)(float); { printf("float"); }

...

Second(&First); // What will be printed?


0 commentaires