La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Para qué sirven los archivos generados automáticamente después de compilar el programa c? Explique por separado.

¿Para qué sirven los archivos generados automáticamente después de compilar el programa c? Explique por separado.

1. Archivo PCH

El archivo de encabezado precompilado (generalmente con la extensión .PCH) es un código relativamente estable en el archivo (.PCH) precompilado del proyecto. Estos códigos precompilados pueden ser cualquier código C/C, incluso funciones en línea, pero son relativamente estables durante todo el proyecto, es decir, código que no se modificará con frecuencia durante el desarrollo del proyecto.

¿Por qué necesito archivos de encabezado precompilados? En una palabra: mejorar la velocidad de compilación. Normalmente, los compiladores compilan en unidades de archivos. Si se modifica un archivo del proyecto, se volverán a compilar todos los archivos, incluido todo el contenido del archivo de encabezado (como macros y preprocesadores). En los programas VC, el contenido de estos archivos de encabezado suele ser muy grande y la compilación llevará mucho tiempo. Sin embargo, no se modifican con frecuencia y son relativamente estables e independientes.

¿Cómo utilizar archivos de encabezado precompilados para mejorar la velocidad de compilación? Para usar un archivo de encabezado precompilado, debemos especificar un archivo de encabezado (.h), que contiene archivos de encabezado, como código que no modificamos con frecuencia, y luego usar este archivo de encabezado (.h) para generar un archivo de encabezado precompilado (. PCH). El archivo de encabezado predeterminado de VC es StdAfx.h. Debido a que el archivo de encabezado no se puede compilar, también necesitamos un archivo .CPP como puente. El archivo predeterminado de VC es StdAfx.cpp. Este archivo tiene un solo código: # #Contiene "StdAfx.h". A continuación, se utilizará para generar un archivo . PCH, que implica varias instrucciones de precompilación importantes: /Yu, /Yc, /Yx, /Fp. En pocas palabras, /Yc es un modificador del compilador que genera un archivo PCH. En Proyecto->Configuración->Encabezados precompilados en la categoría C/C y seleccione. Archivo CPP (StdAfx.cpp predeterminado), utilizado para la compilación y generación. archivo PCH, puede ver el modificador /Yc. Indica si se generará un archivo .PCH después de compilar este archivo (tal vez c de /Yc signifique crear). La directiva /Fp especifica el nombre y la ruta generados. Archivo PCH (posiblemente p de/FP representa la ruta). U de/yu significa uso. En el proyecto, esta directiva /Yu se puede encontrar en todos los archivos, incluido . archivo h. Si es automático... entonces la posición original de /Yc será reemplazada por la instrucción /Yx. El compilador comprobará si está seleccionado automático. El archivo PCH se generó antes de cada compilación. Si hay uno, no se generará ahora o se volverá a compilar.

Nota:

Respuesta: De hecho, los archivos de encabezado predeterminados y los archivos CPP generados por el asistente de proyectos Appzard pueden tener cualquier nombre. La razón es sencilla. Pero si desea hacer esto, recuerde modificar el proyecto correspondiente: gt; establezca los parámetros de varias instrucciones de precompilación (/Yc, /Yu, /Yx, /Fp)...

En cualquiera que contenga Archivos de encabezado que se precompilarán y utilizarán. Los archivos PCH deben comenzar con. Deberías incluir. h (contenido en el archivo .CPP, StdAfx.cpp de forma predeterminada), se especifica. Archivos PCH. Si no está incluido, provocará mi error original. Si no se incluye al principio, te provocará errores inesperados e inexplicables. De lo contrario, si no lo cree.

C.Archivos precompilados. La generación de PCH lleva mucho tiempo y ocupa mucho espacio en disco tras generación, normalmente entre 5 y 6 M. Presta atención a limpiar los inútiles. Una vez completado el proyecto, PCH lo archiva rápidamente para ahorrar espacio en el disco.

D. Si lo pierdes o lo eliminas. Archivo PCH, si desea modificar el archivo del proyecto en el futuro, puede volver a compilar el especificado. Archivo CPP (el valor predeterminado es StdAfx.cpp) para generar. PCH volvió a sacarlo a relucir en lugar de apresurar F7 o reconstruir todo estúpidamente.

2. Archivo BCN

. Sin navegador de compilación. Este archivo se puede eliminar cuando hay un problema con la función de autocompletar. Se generará automáticamente después de la construcción.

3. Archivo OBJ

El archivo de destino suele ser un archivo binario compilado, que se vincula con el archivo de recursos a través del vinculador para formar un archivo exe.

OBJ sólo da la dirección relativa del programa, mientras que EXE es la dirección absoluta.

4. Archivo PDB

El archivo de base de datos del programa (PDB) guarda información de depuración y estado del proyecto, que se puede utilizar para depurar la configuración del vinculador incremental. Al compilar usando /Zi o /ZI (para C/C++), se crea un archivo PDB.

En Visual C, la opción /Fd se utiliza para nombrar el archivo PDB creado por el compilador. Cuando usa el asistente para crear un proyecto en Visual Studio, la opción /Fd se configura para crear un PDB llamado proyecto.PDB

Si usa un archivo MAKE para crear una aplicación C/C y especifica /Zi o /ZI En lugar de /Fd, eventualmente se generarán dos archivos PDB:

*VC80. PDB (más generalmente, VCx0. PDB, donde PDB Este archivo almacena el archivo .exe. Para C/C, se encuentra en el subdirectorio \debug.

El compilador C/C fusiona información de depuración en VCx0 cada vez que se crea un archivo OBJ, la información insertada por el PDB incluye información de tipo, pero no información de símbolos, como definiciones de funciones. Por lo tanto, incluso si cada archivo fuente contiene un archivo de encabezado común, como

el vinculador lo hará. cree un proyecto.PDB que contenga información de depuración para el archivo EXE del proyecto. El archivo project.PDB contiene información de depuración completa (incluidos los prototipos de funciones), no solo información de tipo en VCx0. Ambos archivos PDB también permiten actualizaciones incrementales. el archivo .exe o .dll que crea

El depurador de Visual Studio utiliza la ruta PDB en el archivo EXE o DLL para encontrar el archivo, o la ruta no es válida (por ejemplo, si el proyecto es. movido a otra computadora), el depurador buscará la ruta que contiene el archivo EXE, es decir, especificada en el cuadro de diálogo Opciones (Carpeta de depuración, nodo Símbolos). El depurador no cargará una PDB que no coincida con el archivo binario que se está depurando.

En el enlace incremental, LINK se actualiza. El archivo de estado ilk creado durante el enlace incremental posterior. El nombre base del archivo es .exe o .dll, etc. El archivo ilk se pierde durante el enlace incremental posterior. LINK realiza un enlace completo y crea un nuevo archivo .ilk. Si el archivo .ilk no está disponible, LINK realiza un enlace no incremental

6. Asigna archivos

Windows y. Los sistemas Linux tienen archivos de mapeo, que generalmente se usan para almacenar la información de dirección de los símbolos. Los símbolos aquí generalmente se refieren a nombres de funciones y variables (locales y globales). De acuerdo con esta información de dirección, la dirección se puede traducir al símbolo correspondiente. , que es utilizado por muchas herramientas del sistema y métodos de depuración

(a) Después de compilar el programa, el contenido se guardará en dos categorías, una es código y la otra es:

(1) El código se refiere al código del programa, que a menudo existe en la parte de texto.

(2) Los datos se refieren a las variables declaradas en el programa almacenado, que a menudo existen en la parte de texto. . sección de datos, las variables no inicializadas existirán en la sección bss.

(2) Windows

(1) Archivo de mapeo de un solo módulo

En Windows, cada módulo (dll/exe) corresponde a un archivo de mapeo. Solo necesita activar las opciones correspondientes al compilar.

Método: haga clic derecho en el proyecto, seleccione "Propiedades", luego seleccione "Propiedades de configuración-Enlazador-Depuración" y cambie el elemento "Generar archivo de mapeo" a "Sí".

Después de la compilación, puede encontrar el archivo de mapeo con el mismo nombre que la aplicación en el directorio de depuración/liberación.

El siguiente es el contenido del archivo de mapeo:

La marca de tiempo es 4b 9603 e 2 (marte 09 16:16:34 2010)//Esta es una marca de tiempo, cada compilación Diferentes, las direcciones correspondientes a los siguientes símbolos generalmente también son diferentes.

La dirección de carga preferida es 00010000//Esta es la dirección precargada durante la compilación. De hecho, la dirección donde se carga el módulo puede ser diferente a esta, por lo que al determinar a qué información de símbolo corresponde una dirección, es necesario conocer la dirección inicial real del módulo cargado en la memoria y luego determinarla en función de la compensar.

Categoría de nombre de longitud inicial

0001: 00000000001c 3950h . text code == " para almacenar el código del programa.

0003: 000008b8000af67ch. data data == ".

0003: 000AFF40003930B1h. BSSData = = "Variable no inicializada.

(2) Archivo de mapeo total del sistema operativo: no sé si existe.

(3) Papelera

Dumpbin Es una herramienta de desmontaje que puede generar mucha información sobre archivos exe/dll

dumpbin/allyourmodulename gt; puede guardar toda la información en un.txt, y el tiempo puede ser. que se encuentra en un.txt, el sello, la información de la ruta de depuración original y la lista de funciones son los siguientes:

Valor del encabezado del archivo

Máquina 1C2 (pulgar)

6. número de sección

49EC0BAE marca de fecha y hora MONAPR 2013:44:14 2009//marca de hora

0 puntero de archivo a la tabla de símbolos

0 número de símbolos

p>

Tamaño de título opcional E0

Características 2102

Ejecutable

Fuente de máquina de 32 bits

Biblioteca de enlaces dinámicos

Valor de encabezado opcional

10B magic # (PE32)

Versión del enlazador 9.00

Tamaño de código 53E00

76a 00 Tamaño de datos inicializados

0 Tamaño de datos no inicializados

502 percentil (100502AC)

1000 código básico

55000 base de datos

1000000 base de imagen (1000000 a 100CDFFF)

1000 forma lineal de sección transversal

200 alineación de archivos

Operación 5.01 Versión del sistema

Versión de imagen 0.00

Versión de subsistema 5.01

Versión 0 Win32

Tamaño de imagen CE000

Tamaño de título 400

La biblioteca de 1000000 imágenes (1000000 a 100 cdfff) es información importante, que tiene el mismo significado que la dirección de carga preferida es 1000000 en el archivo de mapa.

Directorio de depuración

Tipo de tiempo tamaño puntero RVA

- - - - - -

49EC0BAE cv 81 000020FC Formato CFC: RSDS, { a5c 699 f 0-C26D-427 e-BC54-3504731ba 9 b 8 }, 1, d:\Projects\Final\MyusbtoOPC_CPL\MyusbtoOPC\Windows Mobile 6 Professional SDK(arm v4 I)\Debug\MyusbtoOPC.pdb/ / Ruta de compilación original.

comenzar finalizar el prólogo excepto el nombre de la función de corrección de 32 bits

0000000010001000 10001040 1000101010n Y Y DllMain

000000810001040 10001064 10001001050N Y Y? subprograma de inicio @ @ YAHPAUHWND _ _ @ @ @ Z(int _ _ cdecl subprograma de inicio(struct HWND _ _ *))

000001010001064 10001068 100010001064N Y Y? subprograma de término @ @ YAXXZ(void _ _ subprograma de término cdecl(void))

0000001810001068 100013DC 100010001078N Y Y cplaplet

00000020 1000141C 100014b 4 10001420N Y Y _ Inicio

0000028100014b 4 100014BC 100014b 4N Y Y GetCurrentProcess

0000030100014BC 100014f 0 100014c 0N Y Y

00000038 100014f 0 1000155C 0 014 F4 N Y Y _ cinit

0000040 1000155C 10001660 100010001560N Y Y< / p>

000004810001660 10001678 10001664N Y Y salida

000005010001678 10001690 1000167 c N Y Y _ salida

000005810001690 100016ac 100016 N Y Y _ ce salir

00000060 100016AC 100016 F8 100016b 0N Y Y _ c _ exit

La dirección correspondiente a la columna de inicio es coherente con la dirección en la asignación, que es muy similar al archivo de asignación.

Nota: Muchos exe o dll ocultan esta información al compilar y el nombre de la función quedará vacío.

(3) Linux

(1) El archivo de mapeo de un solo módulo

Aún no está claro. Por favor, háganos saber lo que sabe.

(2) El archivo de mapeo total del sistema operativo

Después de compilar la imagen, el sistema Linux generará un system.map, que contiene la información de símbolos compilada en el kernel. Diferentes compilaciones generan system.map será diferente.

Debido a que es la información de símbolo del sistema operativo, la dirección cargada es fija, por lo que a diferencia de un único módulo en Windows que se posiciona mediante compensaciones, el símbolo correspondiente se puede encontrar directamente a través de la dirección.

Los signos importantes de su contenido son los siguientes:

_stext//Inicio del segmento de código

_etext//Fin del segmento de código

__data_start// Inicio de datos inicializados

_edata//Fin de datos inicializados

__bss_start//Inicio de datos no inicializados

_end//Fin de todo

Existe una diferencia muy importante entre Linux y Windows. Después de que se inicia Linux, también hay información similar a un archivo Map en proc\kallsyms. El contenido se puede ver mediante el comando cat. De esta manera, después de compilar el kernel, se puede obtener la información de dirección de cualquier símbolo del kernel (variable y nombre de función) sin guardar el archivo de mapeo. Este es realmente un gran tesoro.

Y proc\kallsym tiene más información que system.map. Finalmente, habrá información del símbolo del módulo, que cambiará a medida que cambie el sistema.

(3)comando nm

El comando nm se utiliza para mostrar la información del símbolo del archivo ejecutable. La información de los símbolos incluirá variables globales (como xyz a continuación) y nombres de funciones (como main a continuación), así como algunos símbolos insertados por el compilador (como _ _ data _ start y _ _ BSS _ start a continuación).

La segunda columna representa los atributos del símbolo, donde las mayúsculas representan global y las minúsculas representan local.

Uso: nm[opciones]][archivo]

Enumerar símbolos en [archivo] (el valor predeterminado es a.out).

Ejemplo:

nm helo

08049f20 d _dynamic

08049ff4 d _GLOBAL_OFFSET_ TABLE_

080484ec R_IO_stdin_used

Clase registrada

08049f10 d__CTOR_END__

08049 f0c d _ _ _

08049f18 D__DTOR_END__

08049f14 d__DTOR_LIST__

08048500 r__FRAME_END__

08049f1c d__JCR_END__

08049f1c d__JCR_LIST__

0804a020 A__bss_start

0804a00c D__data_ start

080484a0 t __do_global_ctors_aux

08048340 t__do_global_dtors_aux

0804a010 D__dso_handle

w __gmon_start__

0804849 a T _ _ i686 .get _ PC _ thunk . bx

08049f0c d__init_array_end

08049f0c d__init_array_start

08048430 T__libc_csu_fini

08048440 T__libc_csu_init

U __libc_start_main@@GLIBC_2.0

0804a020 A _edata

0804a028 A _end

080484cc T _fini

080484e8

08048298 Inicialización de prueba

08048310 T_start

0804a020 completada. 6635

0804a00c Wdata_start

0804a024 bdtor_idx.6637

080483a0 T-frame_dummy

080483c4 T supervisor

U printf@@GLIBC_2.0

0804a014 D x

0804a018 D y

0804a01c D z

Helo.c Como sigue:

# incluir ltstdio.h gt

int x = 10

int y = 20

int z = 30

extern int _ _ data _ start//Aquí hay una referencia al símbolo insertado por el compilador.

int main(void)

{

int * ds = amp_ _ data _ start

printf("p\n " , ds);

printf("Ahora x = d\n ", x);

ds = 3;

* ds = 100;

p>

printf("Ahora x = d\n ",x);

}

archivo BID

El compilador compilará por primera vez. La información de estado se guarda en el proyecto. Archivo IDB (el nombre predeterminado es proyecto.IDB o VC60.IDB para archivos compilados sin un proyecto).

El compilador utiliza esta información de estado para acelerar compilaciones posteriores.

8. Archivo SLN

Visual Studio. Las soluciones organizan proyectos, elementos de proyecto y elementos de solución en soluciones proporcionando al entorno referencias a sus ubicaciones en el disco.