GCC
Contract
| Field | Bound contract |
|---|---|
| Trigger | A project compiles with gcc or g++ and the user asks which flags to use for a build mode, how to read a warning or link error, how to enable LTO or PGO, or why a binary is too large or too slow. |
| Authority | Read-only. The skill emits flag sets, commands, and a diagnosis to chat; the user applies them to the build. Rollback is not needed because no file is written. No remote mutation. |
| Side effect | Chat output. Any throwaway compile the skill runs to confirm a flag targets a scratch file, not the project tree. |
| Done | A flag set and diagnosis are reported, every flag in it is confirmed by gcc --help or a scratch compile on the installed GCC, and each error symptom in the request has a named cause and fix. |
Inputs
- Compiler version: required, from
gcc --version. The current stable line is GCC 16.2; older lines lack some flags below and the skill checks each one. - Build goal: required. One of debug, debuggable-optimized, release, size-constrained, or sanitizer.
- Language standard the project requires: required. Passed explicitly as
-std=; C23 and C++23 are the current published standards, C++20 is the floor. - The exact compiler or linker message when the request is a diagnosis: required.
- Build system in use (Make, CMake, shell script): optional; determines where flags go.
Procedure
Confirm the compiler: run
gcc --versionand record the major line. Done when: the GCC line is recorded.Pick the build mode from the table and always add an explicit
-std=; never rely on the implicit default dialect. Done when: one row is chosen and-std=is set.Goal Flags Debug -g -O0 -Wall -WextraDebug with debuggable optimization -g -Og -Wall -WextraRelease -O2 -DNDEBUG -WallRelease, native machine only -O3 -march=native -DNDEBUGRelease, minimum size -Os -DNDEBUGSanitizer, development -g -O1 -fsanitize=address,undefinedSet warning discipline: start from
-Wall -Wextra, add-Wpedanticfor standards conformance, and-Werroronly in CI. Add targeted warnings where the code class warrants them:-Wshadow,-Wconversion,-Wdouble-promotion,-Wformat=2,-Wnull-dereference,-Wundef,-Wcast-qual; for C++ add-Wnon-virtual-dtor,-Woverloaded-virtual,-Wold-style-cast. Suppress a warning only in a narrow scope with#pragma GCC diagnostic push,#pragma GCC diagnostic ignored "-Wname", and#pragma GCC diagnostic pop. Use-wonly for third-party headers as a last resort. Done when: the warning set is stated and any suppression is scoped.Set debug information:
-gemits DWARF at level 2;-g3adds macro definitions for GDBmacro expand;-ggdbselects GDB extensions;-gsplit-dwarfmoves debug data to.dwofiles and shortens link time;-gzcompresses debug sections;-fdebug-prefix-map=old=newremaps paths for reproducible builds. Pair-gwith-Og, not-O0, when the user needs readable optimized code under a debugger. Done when: the debug flags match the goal.Decide the optimization level.
-O3adds loop transformations and more inlining over-O2; recommend it only after a benchmark, because larger code can lose on instruction-cache-bound workloads.-Ofastenables-ffast-math, which drops IEEE 754 guarantees (NaN handling, associativity); recommend it only when the numerical domain explicitly permits it.-march=nativebinds the binary to the build host. Show what a level enables withgcc -Q --help=optimizers -O2 | grep enabled. Done when: the level is chosen with its trade-off stated.Configure LTO when the goal is release: compile every object with
-fltoand link with-fltoagain; use-flto=autofor jobserver parallelism or-flto=Nfor a fixed job count; archive LTO objects withgcc-arandgcc-ranlib, notarandranlib. GCC has no-flto=thin; that spelling is Clang-only. Linker-side details: use linkers-lto. Done when: the LTO commands cover compile, link, and archive.Configure PGO when a representative workload exists: build with
-O2 -fprofile-generate, run the workload to produce.gcdafiles, then rebuild with-O2 -fprofile-use -fprofile-correction.-fprofile-correctionreconciles counts from multi-threaded runs; include it. For the full two-stage flow, BOLT, and Clang's formats: use pgo. Done when: the three PGO steps are listed.Answer preprocessor and standards questions with the exact command:
gcc -E file.cto see expansion,gcc -dM -E - < /dev/nullfor predefined macros,-std=c11 -pedantic-errorsfor strict conformance,-std=cNNrather than-std=gnuNNto disable GNU extensions,gcc -v -E - < /dev/nullfor the include search path,gcc -S -masm=intel -O2 foo.cfor Intel-syntax assembly. Done when: each question maps to one command.Triage errors from the table; when the symptom is absent, reproduce it on a scratch file before naming a cause. Done when: every reported symptom has a cause and fix.
Symptom Cause Fix undefined reference to 'foo'Missing -lfooor the library precedes the object that needs itAdd -lfooafter the object filesmultiple definition of 'x'A variable is defined, not declared, in a header externin the header, one definition in a.cfileimplicit declaration of functionMissing #includeAdd the header that declares it incompatible pointer typesWrong cast or missing prototype Fix the type; check the declaring header C++ ABI mismatch at link Mixed -std=or differentlibstdc++across TUsOne -std=and one toolchain for every TUrelocation truncated to fitA 32-bit relative relocation overflowed -mcmodel=largeor restructure the imageConfirm every flag in the answer against the installed compiler:
gcc -Q --help=target | grep <flag>for target flags, or a scratch compile for the rest. Drop any flag the installed line rejects and say so. Done when: no unconfirmed flag remains in the answer.
Failure and recovery
| Failure class | Behavior |
|---|---|
| GCC version unknown | Ask for gcc --version output or run it; do not guess feature availability. |
| Flag rejected by the installed line | Remove it from the answer, name the line that rejected it, and offer the nearest supported flag. |
| Sanitizer report rather than a compiler error | Sanitizer runtime behavior is outside this skill; read the report's first frame and hand the user the reproduction command. |
| Link error whose library is not on the system | Report the missing library by name; do not invent a package name. |
Numerical code and -Ofast requested |
State the IEEE 754 loss and require an explicit domain permission before recommending it. |
Output
A chat report with three parts: the flag set for the build goal with each flag's purpose, the diagnosis table for every reported symptom, and a confirmation line naming the GCC line the flags were checked against and any flag dropped because that line rejected it.