Comment faire pour imprimer exactement la valeur du compteur de programme en C
Je veux écrire un programme C qui affiche le contenu du compteur de programme PC
. Cela peut être fait à partir de l'espace utilisateur, ou d'assemblage, ou de certaines routines du noyau sont utilisés?
- Débogueur de code de contrôle de l'accès au PC devraient donc être une façon, je pense que l'utilisation d'assembly en ligne.
- Pensez-vous qu'il pourrait être un GCC extension pour le compteur de programme?
- Oui je ne suis pas très sûr mais je pense qu'il devrait y avoir un moyen de contourner ce remarque: si un code vous avez un
lable:
vous pouvez ensuite imprimer son adresse à l'aide de&lable
(ce qui me fait dire que oui). Très à l'arrière de code (légitime) l'utilisation de ce type d'instructions, mais utilise fréquemment dans les logiciels malveillants de code de sorte que son une bonne Fonctionnalité. - Ce lien peut être de l'aide? stackoverflow.com/questions/599968/...
- Vous n'avez pas spécifié de quel PC de la valeur que vous souhaitez imprimer. Celui qui est juste avant l'appel à la fonction d'impression..?
- Pourquoi essayez-vous de le faire? Est-ce juste pour l'expérimentation ou êtes-vous en train d'essayer de faire quelque chose avec ça. Parce que sachant que le PC est quasi jamais quelque chose vous tenez à le savoir. Si il y a quelque chose que vous essayez de faire, il y a sans doute une meilleure façon de le faire. Surtout depuis l'ajout d'une instruction va changer l'offset pour les PC de toute façon.
- En réponse à votre question si: C permet d'accéder directement à l'adresse d'une fonction ou d'une étiquette. Débogueurs l'habitude de prendre une exception si ils ont le PC de l'exception. Dans les BRAS de PC est un registre et une instruction mov tout fonctionne. Méfiez-vous de Pouce mode. Il ya une couple de trucs cool sur cette page: stackoverflow.com/questions/4062403/... . Fondamentalement, saut à un sous-programme qui copie l'adresse de retour qui devrait fonctionner dans presque chaque architecture. LEA instruction peut être utilisé dans les architectures x86.
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de déterminer le PC en utilisant le
__actuels_pc()
intrinsèque dans le BRAS compilateur de la chaîne (le BRAS compilateur prend en charge de nombreuses extensions comme GCC).* C'est particulier de BRAS:En général, le PC est enregistré en tant que l'adresse de retour dans un appel de fonction. Sur la non-BRAS linux les systèmes avec GCC, vous pouvez appeler
__builtin_return_address(0)
pour obtenir l'adresse de retour de la fonction en cours d'contexte d'appel. L'obtention du compteur de programme, de cette façon, encourt la peine d'ajouter un appel de fonction, mais il évite assembly en ligne, afin que cette technique est portable sur tout système pris en charge par GCC.Quand je lance le programme ci-dessus sur mon
x86
système, il produit de la sortie:Lorsque démonté dans
gdb
:EIP
/RIP
) sont pas la même chose.LR
) etPC
sont pas la même chose.LR
au sein de votre func lesPC
du site d'appel). C'est inutilement inefficace.Sur les BRAS, vous pouvez utiliser:
Ou celui-ci devrait fonctionner aussi bien:
L'forcé d'inlining est important ici, car cela vous assure de récupérer
PC
comme par le site d'appel.Edit: viens de me rappeler,
__actuels_pc()
BRAS intrinsèque. GCC devrait l'avoir en tant que bien.Bien, je pense que vous pouvez obtenir l'information par l'insertion, de l'assemblée des blocs à l'intérieur de votre C code. Ce sera dépendent complètement de votre compilateur et le registre de votre plate-forme.
J'ai fait comme ceci:
4004ce
4004e1