Using newer version of GCC and
binutils with the &os; Ports
Collection
MartinMatuska
mm@FreeBSD.org
&tm-attrib.freebsd;
&tm-attrib.general;
2009
The &os; Documentation Project
$FreeBSD$
$FreeBSD$
This article describes how to use newer versions of the
GCC compilers and
binutils from the &os; ports tree.
Custom GCC configurations are also
discussed.
Introduction
The default system compiler as of &os; 8.0 is
GCC version 4.2.1. In addition, the
base system of &os; includes binutils
version 2.15. These versions are several years old and lack,
among other things, support for recent CPU
instructions like SSSE3,
SSE4.1, SSE4.2, etc.
Due to licensing issues, new versions of these applications will
not be integrated into the base system. Luckily, it is possible
to use a newer version of the GCC
compiler (e.g. version 4.4) with the help of the &os; ports
tree.
Prerequisites
Installing binutils from ports
To make use of all of the new features in the latest
GCC versions, the latest version of
binutils needs to be installed.
Installation of the newer version of
binutils is optional; but without it,
there will be no support for new CPU
instructions.
To install the latest available version of
binutils using the &os; ports tree,
issue the following command:
&prompt.root; cd /usr/ports/devel/binutils && make install
Installing GCC from ports
The &os; ports tree offers several new versions of
GCC. The following example is for
the stable version 4.4. However, it is possible to install
previous or later development versions (e.g.
lang/gcc43 or
lang/gcc45).
To install one of the mentioned
GCC ports, run the following
command:
&prompt.root; cd /usr/ports/lang/gcc44 && make install
Configuring ports for custom version of
GCC
Additional system configuration is required in order to use
custom version of GCC installed from
the &os; ports tree.
Adjusting make.conf
Add the following lines to the
/etc/make.conf file (or modify
appropriately):
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
CC=gcc44
CXX=g++44
CPP=cpp44
.endif
Alternatively, it is possible to specify the
${CC} and ${CPP} variables
manually.
The examples above are for GCC
version 4.4. To use gcc43, replace
"gcc44" with "gcc43" and
"4.4" with "4.3" and so
on.
Adjusting libmap.conf
Many of the ports' binaries and libraries link to libgcc_s
or libstdc++. The base system already includes these libraries,
but from an earlier version of GCC
(version 4.2.1). To supply rtld (and ldd) with correct versions,
add the following lines to the
/etc/libmap.conf file (or modify
appropriately):
libgcc_s.so.1 gcc44/libgcc_s.so.1
libgomp.so.1 gcc44/libgomp.so.1
libobjc.so.3 gcc44/libobjc.so.2
libssp.so.0 gcc44/libssp.so.0
libstdc++.so.6 gcc44/libstdc++.so.6
The examples above are for GCC
version 4.4. To use gcc43, replace
"gcc44" with "gcc43"
and so on. Note also that all of these libraries are fully
backwards compatible with base system libraries.
Some C++ programs may refuse to work if these libraries
are not mapped correctly. If it is not feasible to map them
all, it is recommended to map at least libstdc++.so.
Custom CFLAGS for the ports tree
To add custom CFLAGS for the ports tree
which are unsupported by the base system, adjust the
/etc/make.conf according to the following
example:
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
CC=gcc44
CXX=g++44
CPP=cpp44
CFLAGS+=-mssse3
.endif
It is possible to completely replace
CFLAGS and/or define custom
CPUTYPE as well. We recommend setting
CPUTYPE because many ports decide their
optimizations flags based on this variable.
Excluding ports that do not build with new version of
GCC
To exclude ports that have problems with custom version of
GCC, adjust the
/etc/make.conf according to the following
example:
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
.if empty(.CURDIR:M/usr/ports/net/openldap*)
CC=gcc44
CXX=g++44
CPP=cpp44
.endif
.endif
The example above excludes the forced use of
gcc 4.4 for the
net/openldap* ports. It is
also possible to specify more ports on a single line:
.if empty(.CURDIR:M/usr/ports/net/openldap*) && empty(.CURDIR:M/usr/ports/xxx/yyy) && ...
Impact on the binary performance
Using GCC version 4.4 with
SSSE3 instruction set enabled (if supported by
the CPU) may yield up to 10% average increase
in binary performance. In certain tests, the results show
more than a 20% performance boost (e.g. in multimedia
processing).
The table located at http://people.freebsd.org/~mm/benchmarks/perlbench/
shows a comparison of GCC versions
currently available in base &os; system,
GCC version 4.3 and
GCC version 4.4 with various
combinations of CFLAGS using the perlbench
benchmark suite.