About gcc
A skill that guides agents through GCC flags, build modes, warnings, optimization, and common build errors. It covers LTO and PGO workflows for projects using GNU Make, CMake, or shell scripts.
Key features
- 01Choose flags for debug and release builds
- 02Configure warnings and debug information
- 03Tune optimization, LTO, and PGO
- 04Diagnose common compile and link errors
- 05Inspect preprocessing and assembly output
Use cases
- 01Select flags for a GCC release build
- 02Investigate undefined references or ABI errors
- 03Set up profile-guided optimization
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill gccAfter installing, type/gccin Claude Code to confirm it loaded.
Bundled filesreferences/examples.mdreferences/flags.md
Details
From the project READMEGCC
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
| Goal | Recommended 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:
#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 GDBmacro expand)-ggdb— DWARF extensions optimal for GDB-gsplit-dwarf— splits.dwofiles; reduces link time, needed fordebuginfod
Pair -g with -Og (not -O0) when you need readable optimised code in GDB.
4. Optimisation decision tree
Need max throughput on a fixed machine?
yes -> -O3 -march=native -flto
no -> profiling available?
yes -> -O2 -fprofile-use
no -> -O2
Size-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)
# Compile
gcc -O2 -flto -c foo.c -o foo.o
gcc -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 for full flag reference. See skills/binaries/linkers-lto for linker-level LTO configuration.
6. Profile-guided optimisation (PGO)
# Step 1: instrument
gcc -O2 -fprofile-generate prog.c -o prog_inst
# Step 2: run with representative workload
./prog_inst < workload.input
# Step 3: optimise with profile
gcc -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
| Symptom | Likely cause | Fix |
|---|---|---|
undefined reference to 'foo' | Missing -lfoo or wrong link order | Add -lfoo; move -l flags after object files |
multiple definition of 'x' | Variable defined (not just declared) in a header | Add extern in header, define in one .c |
implicit declaration of function | Missing #include | Add the header |
warning: incompatible pointer types | Wrong cast or missing prototype | Fix the type; check headers |
| ABI errors with C++ | Mixed -std= or different libstdc++ | Unify -std= across all TUs |
relocation truncated | Overflow on a 32-bit relative relocation | Use -mcmodel=large or restructure code |
For sanitizer reports, use skills/runtimes/sanitizers.
9. Useful one-liners
# Show all flags enabled at -O2
gcc -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 path
gcc -v -E - < /dev/null 2>&1 | grep -A20 '#include <...>'
# Check if a flag is supported
gcc -Q --help=target | grep march
For a complete flag cheatsheet, see references/flags.md. For common error patterns and examples, see references/examples.md.
Related skills
- Use
skills/runtimes/sanitizersto add-fsanitize=*builds - Use
skills/compilers/clangwhen switching to clang/LLVM - Use
skills/binaries/linkers-ltofor advanced LTO linker flags - Use
skills/debuggers/gdbfor debugging GCC-built binaries