7
votes

Obtenez l'adresse d'une instruction en C / C ++

Toute façon d'obtenir l'adresse d'une instruction? J'ai essayé de faire appel à l'instruction et d'obtenir l'adresse de l'étiquette, mais semble que cela ne fonctionne que dans le compilateur GCC avec l'opérateur &&. (Voir: Cet article ) Et si d'autres compilateurs? < / p>

Toute pensée de cette question?


16 commentaires

C ++ n'est pas tenu d'être mis en œuvre avec des instructions.


Bonjour Basile, je fais actuellement des recherches sur les fonctionnalités d'instructions / de données de données.


Peut-on assumer GCC avec Variables de registre explicite ? Dans ce cas, j'utiliserais registre Char * programme_counter ASM ("PC"); , en supposant que le Compteur de programme enregistre un PC (pour bras, utilisez le pointeur d'instructions, IP, ON X86 ... son processeur dépend).


Seth, désolé, pourquoi j'ai utilisé des instructions au lieu de la déclaration, c'est qu'après la compilation du code, elle aura une ou plusieurs instructions associées à la déclaration. Mais je veux faire référence à la première instruction de la déclaration. Merci de me clarifier.


Bonjour à tous, j'ai également pensé à utiliser le pointeur de fonction sur une fonction qui ne contient que l'instruction que vous souhaitez obtenir l'adresse. C'est une solution, mais je ne pense pas que ce soit une solution nette. :)


@nigong tu manques mon point; Il n'y a aucun moyen que cela puisse être fait dans la norme C parce que c n'a pas de concept d'instructions ni de l'adresse des déclarations. (Désolé j'ai dit C ++ auparavant, j'oublie quelle balise je suis dans tout le temps.)


Je pense qu'il ne cherche pas de manière générique, standard de manière sûre .. Peut-être juste un peu portable? @nigong: Quels sont les compilateurs / plates-formes ciblés?


@Karolyhorvath: tout ce qui est non standard est intrinsèquement non portable.


@Ed s.: Vous avez manqué le mot «un peu» (par exemple: travailler avec GCC et MSVC)


@Karolyhorvath My Plateforme est VDSP des appareils analogiques, mais je cherche également une manière générique de le faire.


@Karolyhorvath: Non, il est intrinsèquement non portable. Bien sûr, dans la pratique, il existe des moyens de contourner cela, mais techniquement, si vous comptez sur quelque chose qui n'est pas spécifié dans la norme, vous risquez de rencontrer des problèmes lorsque vous ciblez une plate-forme différente. C'est beaucoup que je pense que nous pouvons être d'accord sur.


@Ed s.: D'accord? C'était évident.


@Karolyhorvath: Alors qu'est-ce que tu questionnes exactement? Je suis confus.


@Ed S.: Oui, vous semblez être confus. Je viens de lui demander la plate-forme ciblée, c'est tout. Je suppose qu'il cherche plutôt une solution pratique qu'une réponse dogmatique ("Il n'y a pas de manière générique") qui n'a pas beaucoup de valeur pragmatique. Bienvenue dans le monde réel (je plaisante, ne le prenez pas au sérieux).


@Karolyhorvath: Oh, est-ce que c'est le dernier peu comme dit "aucune infraction, mais tu es un idiot"? J'ai déjà dit qu'il y avait évidemment des moyens de travailler autour de lui, ne change pas le fait que le code non standard est intrinsèquement non portable.


@Ed s.: Je ne comprends tout simplement pas ce qui vous a fait penser que je n'étais pas au courant de cela ... mais ce n'est jamais.


4 Réponses :


4
votes

Je ne suis pas sûr que les normes C ++ Language parlent d'instruction; Vous pouvez éventuellement gérer un programme C compilé pour être exécuté par un grand groupe d'esclaves humains (mais ce serait contraire à l'éthique, même si la normalisation conforme). Vous pouvez utiliser vous-même un petit programme simpliste avec un crayon et un papier, vous pouvez utiliser un interprète C, etc ... etc ...

Un compilateur d'optimisation C ou C ++ traduirait également certaines relevés C en plusieurs instructions de la machine situées à différents endroits (en particulier, les compilateurs fonctionnent en ligne ou en clonant ou même des blocs de base, même sans aucun mot de clé en ligne dans le code source).

Sur la plupart des systèmes, vous pouvez guérir le code (par exemple en montage) une routine qui retourne comme une valeur de pointeur son adresse de retour (c'est-à-dire l'adresse de l'appelant).

avec GCC (et compilateurs compatibles, peut-être CLANG / LLVM), vous pouvez utiliser __builtin_return_address et cométine connexes.

gnu libc sur Linux vous offre Backtrace (mais j'ai été reconduit par elle, Quand j'ai essayé).

Notez que ces astuces pourraient ne pas fonctionner lors de la compilation avec -fno-cadre-pointeur

Vous pouvez également envisager de personnaliser GCC E.G. avec des plugins ou EXTENSIONS MELT (MELT est une langue spécifique de domaine, implémentées sous forme de plugin GPLV3 à GCC, pour étendre GCC plus facilement que avec des plugins codés dans c). Votre GCC personnalisé pourrait insérer des appels vers des fonctions d'instrumentation à des endroits appropriés.


3 commentaires

Salut Basile, merci pour votre réponse. Mais je ne voulais pas dire la relation des instructions et de la déclaration. Ce que je veux faire, c'est juste obtenir l'adresse d'une déclaration ou d'une instruction en C / C ++. :)


@Nigong, il dit essentiellement qu'il ne peut même pas y avoir d'instructions du tout. Surtout s'il était géré par des esclaves plutôt que par une CPU.


Si «instruction» et «déclaration» étaient des concepts suffisamment similaires, cela pourrait être réalisable. Cependant, la plupart des déclarations génèrent plusieurs instructions, qui peuvent même pas être consécutives (constructions en boucle, etc.) et peuvent être entrelacées (optimisation, planification d'instructions) avec des instructions d'autres déclarations.



0
votes

La seule construction standard C ou C ++ qui est même proche de l'adresse d'une instruction est un pointeur de fonction que je suppose n'est pas ce que vous voulez dire. Cependant, vous pouvez accomplir la majeure partie de ce que vous pourriez faire avec les valeurs d'étiquettes GCC à la place des pointeurs à des fonctions contenant les blocs de code nécessaires.

Il n'y a pas d'autres options en C / C ++.


0 commentaires

2
votes

prudence: sortie de la boîte ici ..

pouvez-vous avoir la liaison générer un fichier de carte contenant les adresses (relatives ou autrement) des objets d'application (fonctions et données)? Votre application pourrait alors simplement analyser le fichier de carte de liaison ...


1 commentaires

Sur Linux, dladdr est-ce que pour vous -see et dlopen ) ou au moins aide beaucoup.



0
votes

L'adresse de retour d'une fonction est l'emplacement de la prochaine instruction à exécuter lors de votre retour de la fonction en cours. GCC expose cela via __BUILTIN_RETURN_ADDRESS ; Bien que Visual C ++ la fournisse via _returnaddress .


0 commentaires