Linux: principio de compilación y enlace

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:
Inserte la descripción de la imagen aquí

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
Inserte la descripción de la imagen aquí

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
Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

enlace

El procesamiento de la etapa de enlace incluye: fusión de varios segmentos, análisis de símbolos, reubicación de símbolos
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/huifaguangdemao/article/details/108273123
Recomendado
Clasificación