C/C++: entorno de programa y preprocesamiento (parte 1)

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

4. Proceso de vinculació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:

  1. 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 )
  2. 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:

Supongo que te gusta

Origin blog.csdn.net/weixin_73470348/article/details/128943864
Recomendado
Clasificación