6.9.1. Installation of Glibc
Note
The Glibc build system is self-contained and will install
perfectly, even though the compiler specs file and linker are
still pointing to /tools
. The specs
and linker cannot be adjusted before the Glibc install because
the Glibc autoconf tests would give false results and defeat the
goal of achieving a clean build.
Some of the Glibc programs use non-FHS compilant /var/db
directory to store their runtime data.
Apply the following patch to make such programs store their runtime
data in the FHS-compliant locations:
patch -Np1 -i ../glibc-2.26-fhs-1.patch
First create a compatibility symlink to avoid references to /tools
in our final glibc:
ln -sfv /tools/lib/gcc /usr/lib
Determine the GCC include directory and create a symlink for LSB
compliance. Additionally, for x86_64, create a compatibility
symlink required for the dynamic loader to function correctly:
case $(uname -m) in
i?86) GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/7.2.0/include
ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
;;
x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include
ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
;;
esac
Remove a file that may be left over from a previous build attempt:
rm -f /usr/include/limits.h
The Glibc documentation recommends building Glibc in a dedicated
build directory:
mkdir -v build
cd build
Prepare Glibc for compilation:
CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=3.2 \
--enable-stack-protector=strong \
libc_cv_slibdir=/lib
unset GCC_INCDIR
The meaning of the options and new configure
parameters:
-
CC="gcc -isystem
$GCC_INCDIR -isystem /usr/include"
-
Setting the location of both gcc and system include
directories avoids introduction of invalid paths in debugging
symbols.
-
--disable-werror
-
This option disables the -Werror option passed to GCC. This
is necessary for running the test suite.
-
--enable-stack-protector=strong
-
This option increases system security by adding a known
canary (a random integer) to the stack during a function
preamble, and checks it when the function returns. If it
changed, there was a stack overflow, and the program aborts.
-
libc_cv_slibdir=/lib
-
This variable sets the correct library for all systems. We do
not want lib64 to be used.
Compile the package:
make
Important
In this section, the test suite for Glibc is considered critical.
Do not skip it under any circumstance.
Generally a few tests do not pass, but you can generally ignore any
of the test failures listed below. Now test the build results:
make check
You may see some test failures. The Glibc test suite is somewhat
dependent on the host system. This is a list of the most common
issues seen for some versions of LFS:
-
posix/tst-getaddrinfo4
and posix/tst-getaddrinfo5 may fail on
some architectures.
-
The rt/tst-cputimer1
and rt/tst-cpuclock2
tests have been known to fail. The reason is not completely
understood, but indications are that minor timing issues can
trigger these failures.
-
The math tests sometimes fail when running on systems where
the CPU is not a relatively new Intel or AMD processor.
-
The nptl/tst-thread-affinity-{pthread,pthread2,sched}
tests may fail for reasons that have not been determined.
-
Other tests known to fail on some architectures are
malloc/tst-malloc-usable and nptl/tst-cleanupx4.
Though it is a harmless message, the install stage of Glibc will
complain about the absence of /etc/ld.so.conf
. Prevent this warning with:
touch /etc/ld.so.conf
Fix the generated Makefile to skip an uneeded sanity check that
fails in the LFS partial environment:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Install the package:
make install
Install the configuration file and runtime directory for
nscd:
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
Next, install the locales that can make the system respond in a
different language. None of the locales are required, but if some
of them are missing, the test suites of future packages would skip
important testcases.
Individual locales can be installed using the localedef program. E.g., the
first localedef
command below combines the /usr/share/i18n/locales/cs_CZ
charset-independent
locale definition with the /usr/share/i18n/charmaps/UTF-8.gz
charmap
definition and appends the result to the /usr/lib/locale/locale-archive
file. The
following instructions will install the minimum set of locales
necessary for the optimal coverage of tests:
mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
In addition, install the locale for your own country, language and
character set.
Alternatively, install all locales listed in the glibc-2.26/localedata/SUPPORTED
file (it includes
every locale listed above and many more) at once with the following
time-consuming command:
make localedata/install-locales
Then use the localedef command to create and
install locales not listed in the glibc-2.26/localedata/SUPPORTED
file in the
unlikely case you need them.
6.9.2. Configuring Glibc
6.9.2.1. Adding nsswitch.conf
The /etc/nsswitch.conf
file needs
to be created because the Glibc defaults do not work well in a
networked environment.
Create a new file /etc/nsswitch.conf
by running the following:
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
6.9.2.2. Adding time zone data
Install and set up the time zone data with the following:
tar -xf ../../tzdata2017b.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward pacificnew systemv; do
zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz}
zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
The meaning of the zic commands:
-
zic -L
/dev/null ...
-
This creates posix time zones, without any leap seconds. It
is conventional to put these in both zoneinfo
and zoneinfo/posix
. It is necessary to put
the POSIX time zones in zoneinfo
, otherwise various test-suites
will report errors. On an embedded system, where space is
tight and you do not intend to ever update the time zones,
you could save 1.9MB by not using the posix
directory, but some applications or
test-suites might produce some failures.
-
zic -L
leapseconds ...
-
This creates right time zones, including leap seconds. On
an embedded system, where space is tight and you do not
intend to ever update the time zones, or care about the
correct time, you could save 1.9MB by omitting the
right
directory.
-
zic ... -p
...
-
This creates the posixrules
file. We use New York because POSIX requires the daylight
savings time rules to be in accordance with US rules.
One way to determine the local time zone is to run the following
script:
tzselect
After answering a few questions about the location, the script
will output the name of the time zone (e.g., America/Edmonton). There are also some
other possible time zones listed in /usr/share/zoneinfo
such as Canada/Eastern or EST5EDT that are not identified by the
script but can be used.
Then create the /etc/localtime
file
by running:
cp -v /usr/share/zoneinfo/<xxx>
/etc/localtime
Replace <xxx>
with the name of the time zone selected (e.g., Canada/Eastern).
6.9.2.3. Configuring the
Dynamic Loader
By default, the dynamic loader (/lib/ld-linux.so.2
) searches through
/lib
and /usr/lib
for dynamic libraries that are needed
by programs as they are run. However, if there are libraries in
directories other than /lib
and
/usr/lib
, these need to be added to
the /etc/ld.so.conf
file in order
for the dynamic loader to find them. Two directories that are
commonly known to contain additional libraries are /usr/local/lib
and /opt/lib
, so add those directories to the
dynamic loader's search path.
Create a new file /etc/ld.so.conf
by running the following:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
If desired, the dynamic loader can also search a directory and
include the contents of files found there. Generally the files in
this include directory are one line specifying the desired
library path. To add this capability run the following commands:
cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d