Qu'est-ce que __i686.get_pc_thunk.bx? Pourquoi avons-nous besoin de cet appel?
Quand j'ai démonter ma petite fonction, il m'est arrivé de voir cet appel
call 0xf60d2f47 <__i686.get_pc_thunk.bx>.
Je n'ai aucune idée de pourquoi j'ai besoin de cet appel dans mon programme. Toute explication serait utile.
Vous devez vous connecter pour publier un commentaire.
Cet appel est utilisé dans indépendant de la position de code sur x86. Il charge la position du code dans le
%ebx
registre, ce qui permet à des objets globaux (qui est fixe, le décalage entre le code) pour être accessible comme un décalage à partir de ce registre.Indépendant de la Position de code est un code qui peut être chargé et exécuté, non modifiée, à des adresses différentes. Il est important pour le code qui sera lié dans les bibliothèques partagées, car ceux-ci peuvent être mappées à une autre adresse dans les différents processus.
Note qu'un appel équivalent est pas requis sur x86-64, parce que l'architecture a IP-par rapport à des modes d'adressage (qui est, il peut attaquer directement à des emplacements de mémoire comme un décalage à partir de l'emplacement de l'actuel de l'instruction).
L'ajout de plus d'informations, par exemple:
Supposons qu'après vous ne disass sur gdb à l'intérieur de la fonction de démarrage, vous trouverez quelque chose comme ceci:
Puis, après que vous avez appelé __i686.get_pc_thunk.bx, registre ebx sera rempli par la valeur 0x012c17a8, qui est l'adresse de la prochaine instruction.
Vous pouvez lire à la fonction de get_pc(program counter).
J'ai trouvé cet article très agréable pour une meilleure compréhension:
https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html