GCC
From Gentoo Wiki
Resources
GCC or the GNU Compiler Collection is among the most widely used compiler toolchains in the world with official support for: C, C++, Objective-C, Objective-C++, Modula-2 Fortran, Ada, Go, and D. Third-party front ends exist for the Pascal, Modula-3, and VHDL programming languages.[1]
Installation
USE flags
USE flags for sys-devel/gcc The GNU Compiler Collection
+cxx
|
Build support for C++ (bindings, extra libraries, code generation, ...) |
+fortran
|
Add support for fortran |
+nls
|
Add Native Language Support (using gettext - GNU locale utilities) |
+openmp
|
Build support for the OpenMP (support parallel computing), requires >=sys-devel/gcc-4.2 built with USE="openmp" |
+pie
|
Build programs as Position Independent Executables (a security hardening technique) |
+sanitize
|
Build support for various sanitizer functions (ASAN/TSAN/etc...) to find runtime problems in applications. |
+ssp
|
Build packages with stack smashing protection on by default |
ada
|
Build the ADA language (GNAT) frontend |
cet
|
Enable support for control flow hijacking protection. On amd64, this provides Intel Control Flow Enforcement Technology (CET). On arm64, this provides Branch Target Identification (BTI) and Pointer Authentication Code (PAC) support. This is only effective on amd64 or arm64. Only provides benefits on newer CPUs. For Intel, the CPU must be at least as new as Tiger Lake. For AMD, it must be at least as new as Zen 3. This is harmless on older CPUs, but provides no benefit either. For ARM64, PAC was introduced in armv8.3-a, and BTI was introduced in armv8.5-a. When combined with USE=hardened on amd64, GCC will set -fcf-protection by default when building software. The effect is minimal on systems which do not support it, other than a possible small increase in codesize for the NOPs. The generated code is therefore compatible with i686 at the earliest. On arm64, GCC will set -mbranch-protection=standard by default when building software. |
cobol
|
Enable support for the COBOL programming language |
custom-cflags
|
Build with user-specified CFLAGS (unsupported) |
d
|
Enable support for the D programming language |
debug
|
Enables GCC's 'checking' facility via --enable-checking=yes,extra,rtl. This adds checks to various compiler passes for integrity and input validation. This can help catch possible miscompilations early as well as latent bugs which could become real problems in future, but at the cost of slower compile times when using GCC. Unrelated to backtraces. |
default-stack-clash-protection
|
Build packages with stack clash protection on by default as a hardening measure. This enables -fstack-clash-protection by default which protects against large memory allocations allowing stack smashing. May cause slightly increased codesize, but modern compilers have been adapted to optimize well for this case, as this mitigation is now quite common. See https://developers.redhat.com/blog/2020/05/22/stack-clash-mitigation-in-gcc-part-3 and https://www.qualys.com/2017/06/19/stack-clash/stack-clash.txt. |
default-znow
|
Request full relocation on start from ld.so by default. This sets the -z,now (BIND_NOW) flag by default on all linker invocations. By resolving all dynamic symbols at application startup, parts of the program can be made read-only as a hardening measure. This is closely related to RELRO which is also separately enabled by default. In some applications with many unresolved symbols (heavily plugin based, for example), startup time may be impacted. |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
fixed-point
|
Enable fixed-point arithmetic support for MIPS targets in gcc (Warning: significantly increases compile time!) |
go
|
Build the GCC Go language frontend. |
graphite
|
Add support for the framework for loop optimizations based on a polyhedral intermediate representation |
hardened
|
Activate default security enhancements for toolchain (gcc, glibc, binutils) |
ieee-long-double
|
Use accelerated 128-bit IEEE long double ABI (ppc64le only) |
jit
|
Enable libgccjit so other applications can embed gcc for Just-In-Time compilation. |
libgdiagnostics
|
Provide libgdiagnostics (https://gcc.gnu.org/wiki/libgdiagnostics). This also installs the 'sarif-replay' tool. |
libssp
|
Build SSP support into a dedicated library rather than use the code in the C library (DO NOT ENABLE THIS IF YOU DON'T KNOW WHAT IT DOES) |
lto
|
Build using Link Time Optimizations (LTO). Note that GCC is always built with support for building other programs with LTO. This USE flag is for whether GCC itself is built and optimized with LTO. |
modula2
|
Build the GCC Modula-2 language frontend. |
multilib
|
On 64bit systems, if you want to be able to compile 32bit and 64bit binaries |
objc
|
Build support for the Objective C code language |
objc++
|
Build support for the Objective C++ language |
objc-gc
|
Build support for the Objective C code language Garbage Collector |
pch
|
Enable precompiled header support for faster compilation at the expense of disk space and memory |
pgo
|
Build GCC using Profile Guided Optimization (PGO). GCC will build itself and then analyze the just-built binary and then rebuild itself using the data obtained from analysis of codepaths taken. It does not affect whether GCC itself supports PGO when building other software. This substantially increases the build time needed for building GCC itself. |
rust
|
Build support for the Rust language, installs gccrs. |
systemtap
|
enable systemtap static probe points |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
time64
|
Use 64-bit time_t type instead of the regular 32-bit type. This flag is forced on time64 profiles, and masked elsewhere. It should be only used when detection of type width is not possible (e.g. for SRC_URI) |
valgrind
|
Enable annotations for accuracy. May slow down runtime slightly. Safe to use even if not currently using dev-debug/valgrind |
vanilla
|
Do not add extra patches which change default behaviour; DO NOT USE THIS ON A GLOBAL SCALE as the severity of the meaning changes drastically |
vtv
|
Build support for virtual table verification (a C++ hardening feature). This does not control whether GCC defaults to using VTV> Note that actually using VTV breaks ABI and hence the whole system must be built with -fvtable-verify. |
zstd
|
Enable support for ZSTD compression |
The graphite USE flag is needed for the -ftree-loop-optimize
, -fgraphite-identity
, -floop-nest-optimize
, and -floop-parallelize-all
options. [2]
Emerge
root #
emerge --ask sys-devel/gcc
Invocation
user $
gcc --help
Tips
Skip stage 1 build
Warning
This is unsupported and can break the system so this should not be used lightly. Refer to bug #705406 for more info.
This is unsupported and can break the system so this should not be used lightly. Refer to bug #705406 for more info.
It is possible to skip building stage 1 in the 3 stage build process by adding EXTRA_ECONF="--disable-bootstrap" via /etc/portage/package.env.
Writing a GCC Frontend
See this link.
See also
- Clang — a C/C++/Objective-C/C++, CUDA, and RenderScript language front-end for the LLVM project
- GCC_ICE_reporting_guide — guide to debugging GCC Internal Compiler Errors (ICEs)
- GCC_optimization — an introduction to optimizing compiled code using safe, sane CFLAGS and CXXFLAGS.
- Upgrading_GCC
- GCC/Frontend — describes how to write a frontend for GCC using JIT
External resources
- Installing GCC: Building - Details about building gcc including stages and bootstrap
References
- ↑ Wikipedia:GNU_Compiler_Collection
- ↑ https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options Retrieved on Feb 7 2023