Aller au contenu

GCC - Collection GNU Compiler

Copier toutes les commandes Générer PDF

La GNU Compiler Collection (GCC) est l'un des systèmes de compilateur les plus influents et les plus utilisés dans l'histoire de l'informatique. Créé à l'origine par Richard Stallman en 1987 sous le nom de GNU C Compiler, GCC est devenu une collection complète de compilateurs supportant plusieurs langages de programmation dont C, C++, Objective-C, Fortran, Ada, Go et D. En tant que compilateur officiel pour les systèmes GNU et Linux, GCC a joué un rôle central dans le développement de logiciels libres et libres, fournissant les bases d'innombrables applications, systèmes d'exploitation et systèmes embarqués dans le monde entier. Grâce à ses capacités d'optimisation robustes, son large soutien à la plate-forme et son respect des normes linguistiques, il est le compilateur de choix pour tout, depuis les petits projets intégrés jusqu'aux applications de grande entreprise et aux systèmes informatiques performants.

Installation et configuration

Installation de GCC sur différentes plateformes

# Ubuntu/Debian installation
sudo apt update
sudo apt install gcc g++ build-essential

# Install specific version
sudo apt install gcc-11 g++-11

# Install development tools
sudo apt install libc6-dev linux-libc-dev

# CentOS/RHEL/Fedora installation
sudo dnf groupinstall "Development Tools"
sudo dnf install gcc gcc-c++

# Or using yum (older systems)
sudo yum groupinstall "Development Tools"
sudo yum install gcc gcc-c++

# macOS installation (via Xcode Command Line Tools)
xcode-select --install

# Or using Homebrew
brew install gcc

# Windows installation (MinGW-w64)
# Download from https://www.mingw-w64.org/
# Or using MSYS2
pacman -S mingw-w64-x86_64-gcc

# Verify installation
gcc --version
g++ --version

# Check supported languages
gcc --help=target

# List all installed GCC versions
ls /usr/bin/gcc*

# Set default version (Ubuntu/Debian)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 60

GCC Configuration et environnement

# Environment variables
export CC=gcc
export CXX=g++
export CFLAGS="-O2 -Wall"
export CXXFLAGS="-O2 -Wall -std=c++17"

# Cross-compilation setup
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++

# Library paths
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

# Include paths
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH

# Check GCC configuration
gcc -v
gcc -dumpmachine
gcc -dumpversion

# Show default include paths
gcc -E -v - </dev/null
g++ -E -v - </dev/null

# Show default library paths
gcc -print-search-dirs

# Show built-in defines
gcc -dM -E - </dev/null

# Show supported targets
gcc --print-targets

# Show supported multilib
gcc -print-multi-lib
```_

## Compilation de base

### Commandes simples de compilation
```bash
# Compile C program
gcc hello.c -o hello
gcc -o hello hello.c

# Compile C++ program
g++ hello.cpp -o hello
g++ -o hello hello.cpp

# Compile without linking (object file only)
gcc -c source.c
g++ -c source.cpp

# Compile multiple source files
gcc file1.c file2.c file3.c -o program
g++ file1.cpp file2.cpp file3.cpp -o program

# Link object files
gcc file1.o file2.o file3.o -o program

# Compile and run in one line
gcc hello.c -o hello && ./hello

# Compile with specific C standard
gcc -std=c99 program.c -o program
gcc -std=c11 program.c -o program
gcc -std=c17 program.c -o program

# Compile with specific C++ standard
g++ -std=c++11 program.cpp -o program
g++ -std=c++14 program.cpp -o program
g++ -std=c++17 program.cpp -o program
g++ -std=c++20 program.cpp -o program

# Compile for different architectures
gcc -m32 program.c -o program32    # 32-bit
gcc -m64 program.c -o program64    # 64-bit

# Generate assembly output
gcc -S source.c                    # Creates source.s
gcc -S -o output.s source.c

# Generate preprocessed output
gcc -E source.c                    # Output to stdout
gcc -E source.c -o source.i        # Save to file

# Verbose compilation
gcc -v source.c -o program

# Show compilation commands without executing
gcc -### source.c -o program
```_

### Étapes de compilation
```bash
# Four stages of compilation: preprocessing, compilation, assembly, linking

# Stage 1: Preprocessing (cpp)
gcc -E source.c -o source.i
cpp source.c source.i

# Stage 2: Compilation (cc1)
gcc -S source.i -o source.s
gcc -S source.c -o source.s

# Stage 3: Assembly (as)
gcc -c source.s -o source.o
as source.s -o source.o

# Stage 4: Linking (ld)
gcc source.o -o program
ld source.o -o program

# Stop after specific stage
gcc -E source.c                    # Stop after preprocessing
gcc -S source.c                    # Stop after compilation
gcc -c source.c                    # Stop after assembly

# Save intermediate files
gcc -save-temps source.c -o program

# Use specific tools
gcc -B/path/to/tools source.c      # Use tools from specific directory

Options d'optimisation

Niveaux d'optimisation

# No optimization (default, fastest compilation)
gcc -O0 source.c -o program

# Basic optimization (good balance)
gcc -O1 source.c -o program

# Standard optimization (recommended for most cases)
gcc -O2 source.c -o program

# Aggressive optimization (may increase compilation time)
gcc -O3 source.c -o program

# Optimize for size
gcc -Os source.c -o program

# Optimize for fast compilation
gcc -Ofast source.c -o program

# Optimize for debugging
gcc -Og source.c -o program

# Profile-guided optimization (two-step process)
# Step 1: Compile with profiling
gcc -O2 -fprofile-generate source.c -o program
./program  # Run with representative input
# Step 2: Compile with profile data
gcc -O2 -fprofile-use source.c -o program_optimized

# Link-time optimization
gcc -O2 -flto source1.c source2.c -o program

# Specific optimization flags
gcc -O2 -funroll-loops source.c -o program
gcc -O2 -finline-functions source.c -o program
gcc -O2 -fomit-frame-pointer source.c -o program

Optimisation avancée

# Vectorization
gcc -O2 -ftree-vectorize source.c -o program
gcc -O3 -march=native source.c -o program

# Loop optimizations
gcc -O2 -funroll-loops source.c -o program
gcc -O2 -funroll-all-loops source.c -o program
gcc -O2 -fpeel-loops source.c -o program

# Function inlining
gcc -O2 -finline-functions source.c -o program
gcc -O2 -finline-small-functions source.c -o program
gcc -O2 -finline-functions-called-once source.c -o program

# Architecture-specific optimization
gcc -O2 -march=native source.c -o program
gcc -O2 -march=skylake source.c -o program
gcc -O2 -mtune=generic source.c -o program

# Show optimization report
gcc -O2 -fopt-info source.c -o program
gcc -O2 -fopt-info-vec source.c -o program
gcc -O2 -fopt-info-loop source.c -o program

# Disable specific optimizations
gcc -O2 -fno-inline source.c -o program
gcc -O2 -fno-unroll-loops source.c -o program

# Optimization for specific use cases
gcc -O2 -ffast-math source.c -o program        # Fast math (may reduce precision)
gcc -O2 -fno-math-errno source.c -o program    # Don't set errno for math functions
gcc -O2 -funsafe-math-optimizations source.c -o program

Options d'avertissement et d'erreur

Niveaux d'avertissement

# Basic warnings
gcc -Wall source.c -o program

# Extra warnings
gcc -Wextra source.c -o program

# All warnings
gcc -Wall -Wextra source.c -o program

# Treat warnings as errors
gcc -Werror source.c -o program

# Specific warning categories
gcc -Wpedantic source.c -o program             # Strict ISO C compliance
gcc -Wconversion source.c -o program           # Type conversion warnings
gcc -Wshadow source.c -o program               # Variable shadowing
gcc -Wunused source.c -o program               # Unused variables/functions
gcc -Wuninitialized source.c -o program       # Uninitialized variables
gcc -Wformat source.c -o program               # Format string checking
gcc -Wcast-align source.c -o program          # Cast alignment issues
gcc -Wwrite-strings source.c -o program       # String literal modifications

# Disable specific warnings
gcc -Wall -Wno-unused-variable source.c -o program
gcc -Wall -Wno-format source.c -o program

# C++-specific warnings
g++ -Wall -Weffc++ source.cpp -o program      # Effective C++ guidelines
g++ -Wall -Wold-style-cast source.cpp -o program
g++ -Wall -Woverloaded-virtual source.cpp -o program

# Enable additional useful warnings
gcc -Wall -Wextra -Wpedantic -Wformat=2 -Wconversion \
    -Wshadow -Wunused -Wuninitialized -Wcast-align \
    -Wwrite-strings source.c -o program

# Show all available warnings
gcc --help=warnings

Gestion des erreurs

# Stop on first error
gcc -Wfatal-errors source.c -o program

# Maximum number of errors
gcc -fmax-errors=5 source.c -o program

# Colorized output
gcc -fdiagnostics-color=always source.c -o program
gcc -fdiagnostics-color=auto source.c -o program

# Show column numbers in diagnostics
gcc -fdiagnostics-show-location=every-line source.c -o program

# Show option that triggered warning
gcc -fdiagnostics-show-option source.c -o program

# Template backtrace limit (C++)
g++ -ftemplate-backtrace-limit=0 source.cpp -o program

# Syntax-only check (no compilation)
gcc -fsyntax-only source.c

# Check for undefined behavior
gcc -fsanitize=undefined source.c -o program

Débogue et profilage

Renseignements sur les débogueurs

# Generate debug information
gcc -g source.c -o program

# Different debug levels
gcc -g0 source.c -o program        # No debug info
gcc -g1 source.c -o program        # Minimal debug info
gcc -g2 source.c -o program        # Default debug info
gcc -g3 source.c -o program        # Maximum debug info

# Debug format options
gcc -gdwarf-4 source.c -o program   # DWARF version 4
gcc -gstabs source.c -o program     # Stabs format

# Debug with optimization
gcc -O2 -g source.c -o program

# Split debug information
gcc -g -gsplit-dwarf source.c -o program

# Compressed debug sections
gcc -g -gz source.c -o program

# Debug macros
gcc -g3 -gdwarf-4 source.c -o program

# Address sanitizer
gcc -g -fsanitize=address source.c -o program

# Memory sanitizer
gcc -g -fsanitize=memory source.c -o program

# Thread sanitizer
gcc -g -fsanitize=thread source.c -o program

# Undefined behavior sanitizer
gcc -g -fsanitize=undefined source.c -o program

# Leak sanitizer
gcc -g -fsanitize=leak source.c -o program

Support de profilage

# Generate profiling information
gcc -pg source.c -o program
./program
gprof program gmon.out > analysis.txt

# Coverage testing
gcc --coverage source.c -o program
./program
gcov source.c
lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory coverage_html

# Profile-guided optimization
gcc -fprofile-generate source.c -o program
./program  # Run with representative data
gcc -fprofile-use source.c -o program_optimized

# Time profiling
gcc -ftime-report source.c -o program

# Memory usage profiling
gcc -fmem-report source.c -o program

# Stack usage analysis
gcc -fstack-usage source.c -o program

Bibliothèques et liens

Liens statiques et dynamiques

# Link with standard libraries
gcc source.c -lm -o program         # Math library
gcc source.c -lpthread -o program   # POSIX threads
gcc source.c -ldl -o program        # Dynamic loading

# Link with custom libraries
gcc source.c -L/path/to/lib -lmylib -o program

# Static linking
gcc -static source.c -o program

# Create static library
ar rcs libmylib.a file1.o file2.o file3.o

# Create shared library
gcc -shared -fPIC file1.c file2.c -o libmylib.so

# Link with shared library
gcc source.c -L. -lmylib -o program

# Set runtime library path
gcc source.c -L/path/to/lib -lmylib -Wl,-rpath,/path/to/lib -o program

# Show library dependencies
ldd program

# Link order matters
gcc source.c -lmylib -lm -o program

# Whole archive linking
gcc -Wl,--whole-archive -lmylib -Wl,--no-whole-archive source.c -o program

# Version script for shared libraries
gcc -shared -Wl,--version-script=version.map file1.c -o libmylib.so

Inclure les chemins et le préprocesseur

# Add include directories
gcc -I/path/to/headers source.c -o program
gcc -I. -I../include source.c -o program

# System include directories
gcc -isystem /path/to/system/headers source.c -o program

# Define preprocessor macros
gcc -DDEBUG source.c -o program
gcc -DDEBUG=1 source.c -o program
gcc -DVERSION=\"1.0\" source.c -o program

# Undefine macros
gcc -UDEBUG source.c -o program

# Include file directly
gcc -include config.h source.c -o program

# Show include search paths
gcc -E -v - </dev/null

# Dependency generation
gcc -M source.c                     # Generate dependencies
gcc -MM source.c                    # Generate dependencies (no system headers)
gcc -MD source.c -o program         # Compile and generate dependencies
gcc -MMD source.c -o program        # Compile and generate dependencies (no system headers)

Compilation croisée

Architecture cible

# Install cross-compilation toolchain
sudo apt install gcc-arm-linux-gnueabihf
sudo apt install gcc-aarch64-linux-gnu
sudo apt install gcc-mingw-w64

# Cross-compile for ARM
arm-linux-gnueabihf-gcc source.c -o program_arm

# Cross-compile for ARM64
aarch64-linux-gnu-gcc source.c -o program_arm64

# Cross-compile for Windows
x86_64-w64-mingw32-gcc source.c -o program.exe

# Specify target explicitly
gcc -target arm-linux-gnueabihf source.c -o program_arm

# Set sysroot for cross-compilation
gcc --sysroot=/path/to/target/sysroot source.c -o program

# Cross-compilation environment variables
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export STRIP=arm-linux-gnueabihf-strip

# Configure for autotools
./configure --host=arm-linux-gnueabihf --prefix=/usr/local/arm

# CMake cross-compilation
cmake -DCMAKE_TOOLCHAIN_FILE=arm-toolchain.cmake ..

Systèmes embarqués

# Compile for bare metal (no OS)
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb source.c -o program.elf

# Specify memory layout
arm-none-eabi-gcc -T linker_script.ld source.c -o program.elf

# Generate binary file
arm-none-eabi-objcopy -O binary program.elf program.bin

# Generate hex file
arm-none-eabi-objcopy -O ihex program.elf program.hex

# Size information
arm-none-eabi-size program.elf

# Disassemble
arm-none-eabi-objdump -d program.elf

# Common embedded flags
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard \
    -mfpu=fpv4-sp-d16 -Os -ffunction-sections -fdata-sections \
    -Wl,--gc-sections source.c -o program.elf

Caractéristiques avancées

Options linguistiques spécifiques

# C-specific options
gcc -std=c99 -pedantic source.c -o program
gcc -std=gnu99 source.c -o program

# C++-specific options
g++ -std=c++17 -pedantic source.cpp -o program
g++ -std=gnu++17 source.cpp -o program

# Objective-C
gcc -x objective-c source.m -o program

# Mixed language compilation
gcc source.c module.cpp -lstdc++ -o program

# Enable specific language features
g++ -fconcepts source.cpp -o program           # C++20 concepts
g++ -fcoroutines source.cpp -o program         # C++20 coroutines
g++ -fmodules-ts source.cpp -o program         # C++20 modules

# Disable language features
g++ -fno-exceptions source.cpp -o program
g++ -fno-rtti source.cpp -o program

Caractéristiques de sécurité

# Stack protection
gcc -fstack-protector source.c -o program
gcc -fstack-protector-strong source.c -o program
gcc -fstack-protector-all source.c -o program

# Position independent code
gcc -fPIC source.c -o program
gcc -fPIE source.c -o program

# Fortify source
gcc -D_FORTIFY_SOURCE=2 -O2 source.c -o program

# Control flow integrity
gcc -fcf-protection source.c -o program

# Return address protection
gcc -mretpoline source.c -o program

# Address space layout randomization
gcc -fPIE -pie source.c -o program

# Relocation read-only
gcc -Wl,-z,relro,-z,now source.c -o program

# No execute stack
gcc -Wl,-z,noexecstack source.c -o program

Analyse des résultats

# Generate assembly with C code comments
gcc -S -fverbose-asm source.c

# Show optimization decisions
gcc -O2 -fopt-info-vec-optimized source.c -o program
gcc -O2 -fopt-info-loop-optimized source.c -o program

# Benchmark compilation time
time gcc -O2 source.c -o program

# Memory usage during compilation
/usr/bin/time -v gcc -O2 source.c -o program

# Parallel compilation
make -j$(nproc)

# Use ccache for faster recompilation
ccache gcc source.c -o program

# Profile compilation
gcc -ftime-report -fmem-report source.c -o program

L'ensemble complet de fonctionnalités de GCC, ses capacités d'optimisation mature et son large support de plateforme en font un outil indispensable au développement de logiciels dans divers domaines. Des utilitaires simples en ligne de commande aux systèmes intégrés complexes et aux applications informatiques de haute performance, GCC fournit la fiabilité, les performances et la flexibilité nécessaires pour construire des solutions logicielles robustes. Son engagement à l'égard des normes ouvertes, de la communauté du développement actif et de la documentation complète garantit que GCC demeure à l'avant-garde de la technologie du compilateur, en continuant d'évoluer en fonction des besoins changeants du paysage du développement logiciel.