Tabla de contenido
Proceso de compilación y enlace del programa
1. La etapa de preprocesamiento en el proceso de compilación
2. Etapa de compilación formal en el proceso de compilación
3. La fase de montaje del proceso de compilación
Proceso de compilación y enlace del programa
El archivo de código fuente de un programa solo se puede convertir en instrucciones de máquina ejecutables (instrucciones binarias) a través de un complejo proceso de compilación y enlace.
Una descripción general del proceso de compilación y vinculación:
- Proceso de compilación: cada archivo de código fuente que compone un programa se convierte en un archivo objeto ( archivo .o en Linux ) a través del proceso de compilación
(tenga en cuenta que el proceso de compilación de cada archivo fuente se realiza de forma independiente )- Proceso de vinculación: cada archivo de objeto (archivo .o) está vinculado entre sí por un vinculador (vinculador) para formar un programa ejecutable único y completo (archivo .exe)
Diagrama de proceso de compilación y enlace:
1. La etapa de preprocesamiento en el proceso de compilación
La instrucción #modified en el código fuente representa una instrucción de preprocesamiento;
La fase de preprocesamiento del proceso de compilación (algunas operaciones de texto se realizan en la fase de preprocesamiento) principalmente completa:
- Todo en el archivo de encabezado señalado por #include se "copiará y pegará" en el archivo de origen donde se encuentra la instrucción #include
- Reemplazo de símbolos definidos por #define
- Eliminación de comentarios
Nota: no se realiza ninguna verificación de sintaxis en esta etapa
Después de completar el preprocesamiento de un archivo de código fuente , se generará un archivo de código fuente .i correspondiente
En el entorno de compilación gcc de win10, use vscode para preprocesar el archivo de código fuente e ingrese en la terminal:
gcc -E ./文件名 -o 输出的文件名(任意取)
Después de que el compilador ejecute la instrucción, obtendrá el archivo .i correspondiente al archivo fuente preprocesado :
2. Etapa de compilación formal en el proceso de compilación
Las principales cosas que se deben hacer en la fase de compilación formal del proceso de compilación son:
- Realice una verificación de sintaxis y varios análisis del código fuente en el archivo (si la sintaxis es incorrecta, se informará un error de compilación ) (el compilador no verificará si cada identificador está definido en esta etapa )
- Traduzca el código fuente del archivo .i a código ensamblador y genere el archivo .s
- Resumir símbolos
El resumen de símbolos resumirá todas las funciones y nombres de variables globales en el archivo .i después de la modificación , y se preparará para la generación de la tabla de símbolos. ( La tabla de símbolos juega un papel importante en el proceso de vinculación )
En el entorno de compilación gcc de win10, use vscode para compilar formalmente el archivo .i e ingrese en la terminal:
gcc -S ./test.i
Generar archivo .s (código ensamblador)
3. La fase de montaje del proceso de compilación
La fase de ensamblaje del proceso de compilación completa principalmente:
- Compile el archivo .s que almacena las instrucciones de ensamblaje en un archivo .o (archivo binario)
- tabla de símbolos de formulario
Los nombres modificados de todas las funciones en el archivo .s (y las direcciones de los cuerpos de funciones correspondientes) , y los nombres modificados de todas las variables globales (y las direcciones de las instrucciones que las definen) se almacenan en la tabla de símbolos ;
- Tenga en cuenta que si el archivo fuente actual no define una función llamada (o variable global ), entonces la dirección correspondiente a la función (o variable global) en la tabla de símbolos será una dirección no válida (espere hasta la etapa de enlace para completar el direccionamiento). )
Por ejemplo:
4. Proceso de vinculación
Lo principal que logra el proceso de vinculación:
- Fusión de cada archivo .o
- Combinación de tablas de símbolos de cada archivo .o
Por ejemplo:
- Una vez que se completa el proceso de vinculación, si aún no se puede determinar la dirección no válida en la tabla de símbolos , el compilador informará un error de vinculación y se verificará si cada identificador está definido en la etapa de vinculación .
- En C++ , las reglas de decoración para los nombres de funciones en la tabla de símbolos del lenguaje C se modifican , lo que proporciona compatibilidad con el mecanismo subyacente para la sobrecarga de funciones . Consulte: Sobrecarga de funciones http://t.csdn.cn/tYd4h
Una descripción general del proceso de compilación y vinculación: