Compilando un programa en C usando GCC

 C Programming >> Programación C >  >> Tags >> GCC
Compilando un programa en C usando GCC

En este artículo, hemos cubierto cómo compilar un programa C usando el compilador GCC junto con las diferentes etapas, como el preprocesamiento, la compilación, el ensamblaje y la vinculación.

Tabla de contenidos:

  1. Introducción a CCG
  2. Compilación
  3. Ejemplo de código fuente
  4. El proceso de compilación (4 pasos)

Introducción a GCC

GCC es un acrónimo que significa GNU Compiler Collection. GCC es una colección de compiladores y bibliotecas que ofrecen soporte para varios lenguajes de programación como C, C++, Java, etc.

El compilador GCC está incluido en la mayoría de las distribuciones de Linux. En este artículo, hemos usado Ubuntu para todos los ejemplos.
Para verificar si ya está instalado en su sistema, ejecute el siguiente comando:

username@hostname:~$ gcc --version

SALIDA

gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Compilación

Compilar un programa es el proceso de transformar el código fuente (código legible por humanos) en lenguaje de máquina, que es un lenguaje que la computadora puede entender.
Un compilador es un programa informático que traduce el código fuente escrito en un lenguaje de programación de alto nivel (es decir, C) a un lenguaje de bajo nivel como el código de máquina.

Código fuente de ejemplo

Hemos utilizado Vim como nuestro editor.
Cree un nuevo archivo y asígnele el nombre hola.c. El .c extensión de archivo indica que el archivo contiene código fuente escrito en C.

username@hostname:~$ vim hello.c

Código fuente

hello.c
  1 
  2 #include <stdio.h>
  3 
  4 int main() {
  5     printf("Hello World!\n");
  6     return 0;
  7 }
  8 

El proceso de compilación

Hay cuatro pasos principales involucrados en el proceso de compilación como se menciona a continuación:

  1. Preprocesamiento
  2. Compilar
  3. Montaje
  4. Enlace

Hemos utilizado un programa básico hola mundo para mostrar cómo se lleva a cabo el proceso de compilación.

1. Preprocesador

El preprocesador realiza las siguientes tareas:

  • Elimina todos los comentarios en el archivo fuente y los reemplaza con un solo espacio.
  • Incluye el código de los archivos de cabecera.
  • Reemplaza los nombres de macro predefinidos con sus expansiones.

El compilador GCC tiene varias opciones disponibles que pueden detener la compilación después de diferentes pasos.

Para ver el resultado de la etapa de preprocesamiento, podemos usar el comando gcc -E program_name.c opción como se muestra a continuación.

username@hostname:~$ gcc -E hello.c

La salida del preprocesador se envía al terminal. Para guardar la salida, ejecute el siguiente comando:

username@hostname:~$ gcc -E hello.c > hello.i

La extensión de archivo .i indica que el archivo es un archivo preprocesado. El siguiente código es parte del archivo hello.i.

Para ver el archivo ejecute:

username@hostname:~$ vim hello.i

SALIDA

extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 858 "/usr/include/stdio.h" 3 4
extern int __uflow (FILE *);
extern int __overflow (FILE *, int);
# 873 "/usr/include/stdio.h" 3 4

# 3 "hello.c" 2


# 4 "hello.c"
int main() {
    printf("Hello World");
    return 0;
}

2. Compilador

En esta etapa, el compilador toma el archivo preprocesado y dependiendo del compilador genera código IR (Representación Intermedia) o código ensamblador.

Para detener el proceso de compilación después de este paso, podemos usar el comando gcc -S program_name.c opción como se muestra a continuación.

username@hostname:~$ gcc -S hello.c

Este comando crea un hola.s archivo que contiene el código ensamblador.
Para ver el archivo ejecute:

username@hostname:~$ vim hello.s

SALIDA

        .file   "hello.c"
        .text
        .section        .rodata
.LC0:
        .string "Hello World"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        endbr64
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        leaq    .LC0(%rip), %rdi
        movl    $0, %eax
        call    printf@PLT
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8

3. Ensamblador

En la tercera etapa, el ensamblador traduce el código ensamblador en código máquina ejecutable.

Para detener el proceso de compilación después de este paso, podemos usar el comando gcc -S program_name.c opción como se muestra a continuación.

username@hostname:~$ gcc -c hello.c

Este comando crea un hola.o El archivo contiene el código de máquina que no es legible por humanos.

Para ver el archivo ejecute:

username@hostname:~$ vim hello.o

SALIDA

^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^X^C^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^N^@^M^@ó^O^^úUH<89>åH<8d>=^@^@^@^@¸^@^@^@^@è^@^@^@^@¸^@^@^@^@]ÃHello World^@^@GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0^@^@^D^@^@^@^P^@^@^@^E^@^@^@GNU^@^B^@^@À^D^@^@^@^C^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H<90>^A^@^@^\^@^@^@^\^@^@^@^@^@^@^@ ^@^@^@^@E^N^P<86>^BC^M^FW^L^G^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^D^@ñÿ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@

4. Enlazador

Las tareas realizadas por el enlazador incluyen:

  • Vincular todos los archivos de objetos de los diferentes archivos de origen.
  • Vincular las llamadas a funciones con sus definiciones. El enlazador conoce las ubicaciones de las definiciones de funciones en las bibliotecas estáticas o dinámicas.

Para completar el proceso de compilación, tenemos dos opciones:

Opción 1

Ejecute el siguiente comando:

username@hostname:~$ gcc hello.c

Cuando ejecuta este comando, el compilador genera un programa ejecutable llamado a.out . Para ejecutar el programa ejecutable, escriba el siguiente comando:

username@hostname:~$ ./a.out

Opción 2

Para darle al programa ejecutable un nombre diferente, podemos agregar la opción "-o" al comando gcc después del nombre del archivo que estamos compilando, como se muestra a continuación:

username@hostname:~$ gcc hello.c -o helloprogram

Para ejecutar el programa ejecutable, use el siguiente comando:

username@hostname:~$ ./helloprogram

Con este artículo en OpenGenus, debe tener una idea sólida sobre cómo compilar un programa C usando GCC.


No