En Linux, cuando usamos GCC para compilar el programa Hello World, solo necesitamos usar el comando más simple (el código fuente es hello.c)
gcc hello.c
./a.out
De hecho, el proceso anterior se puede dividir en 4 pasos, a saber, preprocesamiento, compilación, ensamblaje y vinculación, como se muestra en la siguiente figura:
Precompilado
En la etapa de compilación previa, los archivos como .cpp y .h se compilan en un archivo .i. El primer paso de la compilación previa es equivalente al siguiente comando:
gcc -E hello.c -o hello.i #-E表示只进行预编译,-o指定生成文件名
La etapa de precompilación procesa principalmente las instrucciones precompiladas que comienzan con "#" en los archivos de código fuente. Por ejemplo, "#include", "#define", etc. Las principales reglas de procesamiento son las siguientes:
- Elimine todo #define y expanda todas las definiciones de macro
- Procesar todas las instrucciones precompiladas, como #if, #ifdef, #elif, #else, #endif
- Procese la directiva #include precompilada e inserte el archivo incluido en la posición de la directiva precompilada. (Este proceso se realiza de forma recursiva, lo que significa que el archivo incluido también puede contener otros archivos)
- Eliminar todos los comentarios "//" y "/ * * /"
- Agregue el número de línea y la identificación del nombre de archivo, de modo que el compilador pueda generar información de número de línea para depurar al compilar y pueda mostrar el número de línea al compilar errores o advertencias
- Mantenga todas las directivas del compilador #pragram, porque el compilador las usará
El archivo .i precompilado no contiene ninguna definición de macro, porque todas las macros se han expandido y los archivos incluidos también se insertan en el archivo .i. Puede verificar si la definición de macro es correcta o no mirando el archivo .i. ¿El archivo de encabezado está incluido correctamente?
El procesamiento de la etapa de precompilación se puede resumir en los siguientes tres puntos :
- Procesando instrucciones precompiladas
- Eliminar comentario
- Reemplazo de macro
El contenido del archivo hello.c y el archivo hello.i generado por la compilación previa son los siguientes
Compilar
El proceso de compilación consiste en realizar una serie de análisis léxico, análisis gramatical, análisis semántico y optimización en el archivo preprocesado para generar archivos de código ensamblador. Este proceso es la parte central de la construcción del programa. El comando:
gcc -S hello.i -o hello.s
El contenido del archivo hello.c y el archivo hello.s compilado son los siguientes
Compilacion
El proceso de ensamblaje convierte el código de ensamblaje en instrucciones ejecutables de la máquina
gcc -c hello.s -o hello.o
El procesamiento de este proceso incluye: traducir a binario, generar cada segmento, generar tabla de símbolos
. El archivo hello.o generado por el ensamblaje es un archivo binario, y se distorsionará para verlo con vim. Use el comando objdump para ver
objdump -h hello.o
enlace
El procesamiento de la etapa de enlace incluye: fusión de varios segmentos, análisis de símbolos, reubicación de símbolos