Gcc

mohitmishra786/low-level-dev-skills/skills/compilers/gcc

by mohitmishra786bdc58472fa9fNo license253 starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated 3 months ago

GCC compiler skill for C/C++ projects. Use when selecting optimization levels, warning flags, debug builds, LTO, sanitizer instrumentation, or diagnosing compilation errors with GCC. Covers flag selection for debug vs release, ABI concerns, preprocessor macros, profile-guided optimization, and integration with build systems. Activates on queries about gcc flags, compilation errors, performance tuning, warning suppression, or cross-standard compilation.

Instructions onlySoftware Development
AI-generated overview

Guides GCC flag selection, build modes, warning triage, LTO, PGO and common C/C++ compilation errors.

What it does
This skill provides guidance for invoking the GCC compiler on C and C++ projects. It covers choosing debug versus release flags, warning discipline, debug information options, optimisation trade-offs, link-time optimisation, profile-guided optimisation, preprocessor inspection and common error triage. It produces recommendations and command-line examples rather than files or scripts.
When to use it
Use it when selecting GCC flags for a build, diagnosing compilation or linker errors, tuning performance or binary size, or setting up LTO, PGO or sanitizer instrumentation. It is also relevant for questions about warning suppression, ABI mismatches and standards compliance.
Requirements
No scripts are shipped; it is instructions only. It assumes GCC is available and that the project uses GNU Make, CMake or a shell script.

GCC

Purpose

Guide agents through GCC invocation: flag selection, build modes, warning triage, PGO, LTO, and common error patterns. Assume the project uses GNU Make, CMake, or a shell script.

Triggers

  • "What flags should I use for a release build?"
  • "GCC is giving me a warning/error I don't understand"
  • "How do I enable LTO / PGO with GCC?"
  • "How do I compile with -fsanitize?"
  • "My binary is too large / too slow"
  • Undefined reference errors, ABI mismatch, missing symbols

Workflow

1. Choose a build mode

GoalRecommended flags
Debug-g -O0 -Wall -Wextra
Debug + debuggable optimisation-g -Og -Wall -Wextra
Release-O2 -DNDEBUG -Wall
Release (max perf, native only)-O3 -march=native -DNDEBUG
Release (min size)-Os -DNDEBUG
Sanitizer (dev)-g -O1 -fsanitize=address,undefined

Always pass -std=c11 / -std=c++17 (or the required standard) explicitly. Never rely on the implicit default.

2. Warning discipline

Start with -Wall -Wextra. For stricter standards compliance add -Wpedantic. To treat all warnings as errors in CI: -Werror.

Suppress a specific warning only in a narrow scope:

c
#pragma GCC diagnostic push#pragma GCC diagnostic ignored "-Wunused-parameter"// ...#pragma GCC diagnostic pop

Do not pass -w (silences everything) except as a last resort for third-party headers.

3. Debug information

  • -g — DWARF debug info, default level 2
  • -g3 — includes macro definitions (useful with GDB macro expand)
  • -ggdb — DWARF extensions optimal for GDB
  • -gsplit-dwarf — splits .dwo files; reduces link time, needed for debuginfod

Pair -g with -Og (not -O0) when you need readable optimised code in GDB.

4. Optimisation decision tree

text
Need max throughput on a fixed machine?  yes -> -O3 -march=native -flto  no  -> profiling available?           yes -> -O2 -fprofile-use           no  -> -O2Size-constrained (embedded, shared lib)?  yes -> -Os  (or -Oz with clang)

-O3 vs -O2: -O3 adds aggressive loop transformations (-funswitch-loops, -fpeel-loops, -floop-interchange) and more aggressive inlining. Use -O3 only after benchmarking; it occasionally regresses due to i-cache pressure.

-Ofast: enables -ffast-math which breaks IEEE 754 semantics (NaN handling, associativity). Avoid unless the numerical domain explicitly permits it.

5. Link-time optimisation (LTO)

bash
# Compilegcc -O2 -flto -c foo.c -o foo.ogcc -O2 -flto -c bar.c -o bar.o# Link (must pass -flto again)gcc -O2 -flto foo.o bar.o -o prog

Use gcc-ar / gcc-ranlib instead of ar / ranlib when archiving LTO objects into static libs.

For parallel LTO: -flto=auto (uses make-style jobserver) or -flto=N.

See references/flags.md [blocked] for full flag reference. See skills/binaries/linkers-lto for linker-level LTO configuration.

6. Profile-guided optimisation (PGO)

bash
# Step 1: instrumentgcc -O2 -fprofile-generate prog.c -o prog_inst# Step 2: run with representative workload./prog_inst < workload.input# Step 3: optimise with profilegcc -O2 -fprofile-use -fprofile-correction prog.c -o prog

-fprofile-correction handles profile data inconsistencies from multi-threaded runs.

7. Preprocessor and standards

  • Inspect macro expansion: gcc -E file.c | less
  • Dump predefined macros: gcc -dM -E - < /dev/null
  • Force strict standard: -std=c11 -pedantic-errors
  • Disable GNU extensions: -std=c11 (not -std=gnu11)

8. Common error triage

SymptomLikely causeFix
undefined reference to 'foo'Missing -lfoo or wrong link orderAdd -lfoo; move -l flags after object files
multiple definition of 'x'Variable defined (not just declared) in a headerAdd extern in header, define in one .c
implicit declaration of functionMissing #includeAdd the header
warning: incompatible pointer typesWrong cast or missing prototypeFix the type; check headers
ABI errors with C++Mixed -std= or different libstdc++Unify -std= across all TUs
relocation truncatedOverflow on a 32-bit relative relocationUse -mcmodel=large or restructure code

For sanitizer reports, use skills/runtimes/sanitizers.

9. Useful one-liners

bash
# Show all flags enabled at -O2gcc -Q --help=optimizers -O2 | grep enabled
# Preprocess only (check includes/macros)gcc -E -dD src.c -o src.i
# Assembly output (Intel syntax)gcc -S -masm=intel -O2 foo.c -o foo.s
# Show include search pathgcc -v -E - < /dev/null 2>&1 | grep -A20 '#include <...>'
# Check if a flag is supportedgcc -Q --help=target | grep march

For a complete flag cheatsheet, see references/flags.md [blocked]. For common error patterns and examples, see references/examples.md [blocked].

Related skills

  • Use skills/runtimes/sanitizers to add -fsanitize=* builds
  • Use skills/compilers/clang when switching to clang/LLVM
  • Use skills/binaries/linkers-lto for advanced LTO linker flags
  • Use skills/debuggers/gdb for debugging GCC-built binaries

Source and attribution

Source:mohitmishra786/low-level-dev-skillsinskills/compilers/gccat commitbdc5847

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal