Le processus de Liaison de la Table et Global Offset Table
Je suis de lecture cet article sur la PLT (Processus de Liaison de la Table) et a OBTENU (Global Offset Table). Alors que le but de la PLT est clair pour moi, je suis toujours confus au sujet de GOT. Ce que j'ai compris de l'article, c'est que GOT est nécessaire uniquement pour les variables déclarées comme extern
dans une bibliothèque partagée. Pour les variables globales déclarées comme static
dans une bibliothèque partagée code, il n'est pas nécessaire.
Est ma compréhension de la droite, ou suis-je complètement à côté du sujet.
OriginalL'auteur MetallicPriest | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
Peut-être que votre confusion avec le sens de l'
extern
. Depuis la liaison par défaut estextern
, toute variable déclarée en dehors de la portée de la fonction sans lastatic
mot-clé estextern
.La raison, le GOT est nécessaire, c'est parce que l'adresse des variables accessibles par la librairie partagée code n'est pas connue au moment de la bibliothèque partagée est généré. Il dépend de l'adresse de chargement de la bibliothèque est chargé (si la définition est dans la bibliothèque elle-même) ou de la troisième partie du code de la variable est définie en (si la définition est d'ailleurs). Donc, plutôt que de mettre l'adresse en ligne dans le code, le compilateur génère du code pour lire la bibliothèque partagée a et charge ensuite l'adresse de la OBTENU lors de l'exécution.
Si la variable est connu à être définies au sein de la même bibliothèque partagée (soit parce que c'est
static
ou lahidden
ouprotected
visibilité de l'attribut est utilisé), puis l'adresse relative au code de la bibliothèque peut être fixé au moment de la bibliothèque partagée fichier est généré. Dans ce cas, plutôt que d'effectuer une recherche par le biais de la a OBTENU, le compilateur génère du code pour accéder à la variable avec le programme de lutte contre l'adressage relatif. C'est moins cher à la fois à l'exécution et au moment du chargement (car l'ensemble de la recherche de symbole et processus de réinstallation peut être ignorée au moment du chargement).Je ne peux pas penser à une voie droite; pourquoi avez-vous besoin?
Je suis en train de faire ma demande pour un processeur ARM comme indépendant de la position de l'exécutable et tout fonctionne bien sauf pour les variables statiques. Le problème, c'est que .section de texte et de .de données/.sev sections différentes de réinstallation des compensations, si pc-accès par rapport aux variables statiques ne fonctionne pas alors que l'accès à travers le GOT fonctionne très bien.
Comment voulez-vous que le code à trouver le GOT si elle n'est pas fixe à un décalage à partir de la
.text
section? Sur les systèmes normaux, le décalage entre le texte et les données est fixé au moment de la liaison, et le chargeur vous assure qu'il est conservé lors du chargement du programme.Il est possible en utilisant SBR-l'adressage relatif, voir stackoverflow.com/a/24408631/779419
OriginalL'auteur R..