2012-07-17 13 views
6

¿Alguna forma de obtener la dirección de una instrucción? He intentado etiquetar las instrucciones y obtener la dirección de la etiqueta, pero parece que solo funciona en el compilador GCC con el operador & &. (Consulte: this article) ¿Qué pasa si otros compiladores?Obtener la dirección de una instrucción en C/C++

¿Alguna idea de esta pregunta?

+0

¿Por qué lo pide? –

+4

No se requiere que C++ se implemente con las instrucciones. –

+0

Hola, Basile, actualmente estoy investigando sobre las funciones de instrucción/reloj de datos. – nigong

Respuesta

4

No estoy seguro de que los estándares de lenguaje C o C++ hablen de instrucción; Es concebible que ejecute un programa C compilado para ser ejecutado por un gran grupo de esclavos humanos (pero eso no sería ético, incluso si se ajustase a las normas). Puede ejecutar usted mismo un pequeño programa simplista con un lápiz y papel, puede usar un intérprete C, etc. ... etc ...

Un compilador optimizador C o C++ también traduciría algunas sentencias C en varias instrucciones de la máquina ubicados en varios lugares (en particular, los compiladores hacen funciones en línea o clonar o incluso bloques básicos, incluso sin ninguna palabra clave inline en el código fuente).

En la mayoría de los sistemas, puede codificar manualmente (por ejemplo, en el ensamblaje) una rutina que devuelve como valor de puntero su dirección de retorno (es decir, la dirección de la persona que llama).

Con GCC (y compiladores compatibles, tal vez Clang/LLVM), puede usar __builtin_return_address y construcciones internas relacionadas.

Gnu Libc en Linux le ofrece backtrace (pero me ha decepcionado, cuando lo intenté).

en cuenta que estos trucos no pudo trabajar al compilar con -fno-frame-pointer

También puede considerar la personalización de GCC, por ejemplo, con complementos o extensiones MELT (MELT es un lenguaje específico de dominio, implementado como un complemento GPLv3 para GCC, para extender GCC más fácilmente que con los complementos codificados en C). Su GCC personalizado puede insertar llamadas a funciones de instrumentación en lugares apropiados.

+0

Hola Basile, gracias por tu respuesta. Pero no quise decir la relación de instrucciones y declaración. Lo que quiero hacer es obtener la dirección de un enunciado o instrucción en C/C++. :) – nigong

+1

@nigong Básicamente dice que puede que ni siquiera haya instrucciones. Especialmente si estuviera siendo dirigido por esclavos en lugar de una CPU. – Mysticial

+1

Si 'instrucción' y 'enunciado' fueran conceptos suficientemente similares, esto podría ser factible. Sin embargo, la mayoría de las declaraciones generan múltiples instrucciones, que pueden no ser consecutivas (construcciones de bucle, etc.) y pueden intercalarse (optimización, programación de instrucciones) con instrucciones de otras declaraciones. – twalberg

0

La única construcción estándar de C o C++ que está cerca de la dirección de una instrucción es un puntero a la función, que supongo que no es lo que quiere decir. Sin embargo, puede lograr la mayor parte de lo que podría hacer con los valores de etiqueta de gcc usando indicadores en lugar de las funciones que contienen los bloques de código necesarios.

No hay otras opciones en C/C++.

2

Precaución: Camino de la caja aquí ..

¿Se puede tener el enlazador generar un archivo de mapa que contiene las direcciones relativas (o no) de las aplicaciones de los objetos (funciones y datos)? Su aplicación podría simplemente analizar el archivo de mapa del enlazador ...

+0

En Linux, 'dladdr' hace eso por ti -ver' 'y' dlopen') o al menos ayuda mucho. –

Cuestiones relacionadas