GCC - GNU Compiler Collection¶
La GNU Compiler Collection (GCC) si erge come uno dei sistemi di compilazione più influenti e ampiamente utilizzati nella storia dell'informatica. Originariamente creato da Richard Stallman nel 1987 come GNU C Compiler, GCC si è evoluto in una raccolta completa di compilatori che supportano più linguaggi di programmazione, tra cui C, C++, Objective-C, Fortran, Ada, Go e D. Come compilatore ufficiale per i sistemi GNU e Linux, GCC ha svolto un ruolo cruciale nello sviluppo di software libero e open-source, fornendo la base per innumerevoli applicazioni, sistemi operativi e sistemi embedded in tutto il mondo. Le sue robuste capacità di ottimizzazione, l'ampio supporto di piattaforme e l'aderenza agli standard dei linguaggi lo hanno reso il compilatore di scelta per tutto, dai piccoli progetti embedded alle applicazioni aziendali su larga scala e ai sistemi di calcolo ad alte prestazioni.
Installazione e Configurazione¶
Installazione di GCC su Diverse Piattaforme¶
# 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
Configurazione di GCC e Ambiente¶
# 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
Compilazione Base¶
Comandi di Compilazione Semplici¶
# 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
Fasi di Compilazione¶
# 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
Opzioni di Ottimizzazione¶
Livelli di Ottimizzazione¶
# 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
Ottimizzazione Avanzata¶
# 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
Opzioni di Avvisi ed Errori¶
Livelli di Avviso¶
# 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
Gestione degli Errori¶
# 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
Debug e Profilazione¶
Informazioni di Debug¶
# 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
Supporto per la Profilazione¶
# 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
Librerie e Linking¶
Linking Statico e Dinamico¶
# 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
Percorsi di Inclusione e Preprocessore¶
# 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)
Cross-Compilazione¶
Architettura di Destinazione¶
# 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 ..
Sistemi Embedded¶
# 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
Funzionalità Avanzate¶
Opzioni Specifiche del Linguaggio¶
# 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
Funzionalità di Sicurezza¶
# 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
Analisi delle Prestazioni¶
# 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'ampio set di funzionalità di GCC, le capacità mature di ottimizzazione e il supporto esteso di piattaforme lo rendono uno strumento indispensabile per lo sviluppo software in diversi ambiti. Dai semplici utility a riga di comando ai sistemi embedded complessi e alle applicazioni di calcolo ad alte prestazioni, GCC fornisce l'affidabilità, le prestazioni e la flessibilità necessarie per costruire soluzioni software robuste. Il suo impegno per gli standard aperti, la comunità di sviluppo attiva e la documentazione esaustiva garantiscono che GCC rimanga all'avanguardia della tecnologia dei compilatori, continuando a evolversi con le mutevoli esigenze del panorama dello sviluppo software.
Note: For placeholders 3-19, I've left them empty as no specific text was provided to translate. If you have specific texts for those sections, I can translate them as well.