gcc - bunnyamin/bunnix GitHub Wiki
Compile
Configure
- Environment variables that can be passed directly to configure.
- Variables that can be passed directly to configure or exported as environment variables.
Path to AS and LD can be defined using
--with-as="/path/to/$TARGET-as"--with-ld="/path/to/$TARGET-ld"and should also define--with-gnu-as--with-gnu-ldrespectively.
Common installation paths
--srcdirdefines the path to source directory.--prefixdefines path for architecture-independent files. Default/usr/local.--exec-prefixdefines path for architecture-dependent files. Default$PREFIX.--bindirdefines path for user binaries. Default$EPREFIX/bin.--libdirdefines path for object code libraries. Default$EPREFIX/lib.--libexecdirdefines path to program specific executables. Default$EPREFIX/libexec.--includedirdefines path for C header files. Default$PREFIX/include.
Cross compiler
--with-build-sysrootwhen build system ($MACHTYPE) is building the system, which directory to use to build GCC.--with-build-time-toolsdefines path to target tools during the build.--enable-version-specific-runtime-libs"Specify that runtime libraries should be installed in the compiler specific subdirectory (libdir/gcc) rather than the usual places. In addition, [libstdc++] include files will be installed intolibdirunless you overruled it by using--with-gxx-include-dir=dirname. Using this option is particularly useful if you intend to use several versions of GCC in parallel. The default isyesforlibada, andnofor the remaining libraries."--with-native-system-header-dir"Specifies that dirname is the directory that contains native system header files, rather than/usr/include. This option is most useful if you are creating a compiler that should be isolated from the system as much as possible. It is most commonly used with the--with-sysrootoption and will cause GCC to searchdirnameinside the system root specified by that option."--with-sysroot=$SYSROOTSpecifies the sysroot directory. For example/home/user/sysroot.--with-native-system-header-dir=/usr/includeTells GCC where to find system headers in the sysroot.- The path have to be absolute but its base is the sysroot. For example,
--with-native-system-header-dir=/different_includebecomes/home/user/sysroot/different_include --with-local-prefixDo not specify /usr as the --with-local-prefix!
Make
- Environment variables that can be passed directly to make.
- Variables that can be passed directly to make or exported as environment variables.
Search paths
| Parameter | Comment |
|---|---|
-B |
Defines path for the compiler to binaries, library, include, and data files. |
-I |
Defines path for the linker to a directory containing headers. |
-L |
Defines path for the linker to a directory containing libraries. |
-l |
Defines path for the linker to a specific library file. For example libc.so is linked as -lc. |
-Wl,option |
Defines option for the linker. |
-iquote ‘$SYSROOT/quoted/' |
Note: One hyphen, no equal symbol, single quotes. The -iquote only affects header files that are included using the #include directive. For example, it is observed in SEARCH_DIR("...") when ld.bfd --verbose. |
-iquote "=/quoted/" |
Note: One hyphen, no equal symbol, single or double quotes. Shorthand for defining ‘$SYSROOT/quoted/'. |
Note: LD -I defines --dynamic-linker PROGRAM not an include directory.
Environment variables
Search paths can be defined as environment variables.
| Environment variable | Description |
|---|---|
LD_LIBRARY_PATH |
Defines path to shared libraries for the compiled program, after its compilation. Any static library should be included in the compiled binary. |
LIBRARY_PATH |
Defines path to shared and static libraries for GCC before compilation. |
PATH |
Defines path to binaries. |
Variables
GCC accepts some "implicit variables".
| Variable | Description |
|---|---|
AR |
Defines host path to archive binary. Default is (Binutils) ar. |
AS |
Defines host path to assembler binary. Default is (Binutils) as. |
LD |
Defines host path to linker binary. Default is (Binutils) ld |
CC |
Defines host path to C compiler binary. Default is (GCC) cc. |
CCX |
Defines host path to C++ compiler binary. Default is (GCC) g++. |
CPP |
Defines host path to C preprocessor binary. Default is (GCC) $(CC) -E. |
OBJCOPY |
Defines host path to objcopy. Default is (Binutils) objcopy. |
OBJDUMP |
Defines host path to objdump. Default is (Binutils) objdump. |
RANLIB |
Defines host path to ranlib. Default is (Binutils) ranlib. |
STRIP |
Defines host path to strip. Default is (Binutils) strip. |
Arguments can be passed to each respective binary with variables named after them and a "FLAGS" suffix. For example:
ARFLAGSASFLAGSLDFLAGSCFLAGSCXXFLAGSCPPFLAGS
Additionally each variable can be specified for the build or target compilation
by appending _FOR_BUILD and _FOR_TARGET respectively. For example
CC_FOR_BUILDCFLAGS_FOR_BUILDCFLAGS_FOR_TARGETAlthough, no official documentation has been found for_FOR_BUILD.
The library path to the linker can also be defined:
LDLIBSLibrary flags or names given to compilers when they are supposed to invoke the linker, ‘ld’.LOADLIBESis a deprecated (but still supported) alternative to LDLIBS. Non-library linker flags, such as -L, should go in theLDFLAGSvariable.
System root
The system root defines a path that is prepended to header and library paths. For example:
- Defining the system root as
/path/to/sysroot/ensures that the paths to header and library expand from it, that is if they are defined as/usr/include/and/usr/lib/respectively then their search paths become/path/to/sysroot/usr/include/and/path/to/sysroot/usr/lib/
| Parameter | Comment |
|---|---|
--sysroot="" |
Two hyphens |
-isysroot "" |
One hyphen and no equal symbol |
If only -isysroot is defined then it is prepended only to the header path.
If both -isysroot and --sysroot are defined then they are prepended to the
header and library path respectively.
Debugging, errors, troubleshooting
C compiler cannot create executables
Compilation fails because of error:
checking for C compiler default output file name...
configure: error: in `/path/to/gnu/gcc/8.4.0/compile-aarch64':
configure: error: C compiler cannot create executables
See `config.log' for more details.
The cause is either that the host or build system x86-64 binaries are used instead of the target system aarch64 binaries, or the other way around, for
configureand, ormake.
The remedy is to define the path to the correct binaries. There are several available methods:
- Environment variables for
configureandmake - Variables for
configureandmake - Compile Configure for
ASandLD
LD cannot find modules in path
Compilation fails because of error:
...
/path/to/sysroot/bin/aarch64-linux-gnu-ld: cannot find /path/to/sysroot/lib/libc.so.6 inside /path/to/sysroot/
/path/to/sysroot/bin/aarch64-linux-gnu-ld: cannot find /path/to/sysroot/lib/libc_nonshared.a inside /path/to/sysroot/
/path/to/sysroot/bin/aarch64-linux-gnu-ld: cannot find /path/to/sysroot/lib/ld-linux-aarch64.so.1 inside /path/to/sysroot/
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:985: libgcc_s.so] Error 1
...
The cause is because the path is undefined or mangled in lib.so:
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( /path/to/sysroot/lib/libc.so.6 /path/to/sysroot/lib/libc_nonshared.a AS_NEEDED ( /path/to/sysroot/lib/ld-linux-aarch64.so.1 ) )
Should be:
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-aarch64.so.1 ) )
The remedy is to configure glibc with --prefix=/ and then
install with DESTDIR="/path/to/sysroot" make install.
- Compare Answer by Sajad Banooie (2018-01-19) to question Can not hardcode library search path of binutils.