¿Para qué sirven los archivos generados automáticamente después de compilar el programa c? Explique por separado.
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 p>
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 p>
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>
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.