6.9.1. Installation of Glibc
Note
Some packages outside of LFS suggest installing GNU libiconv in
order to translate data from one encoding to another. The
project's home page (http://www.gnu.org/software/libiconv/)
says “This library provides an
iconv()
implementation, for use on
systems which don't have one, or whose implementation cannot
convert from/to Unicode.” Glibc provides an
iconv()
implementation and can
convert from/to Unicode, therefore libiconv is not required on an
LFS system.
The Glibc build system is self-contained and will install
perfectly, even though the compiler specs file and linker are still
pointing at /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.
When running make
install, a script called test-installation.pl
performs a small sanity test
on our newly installed Glibc. However, because our toolchain still
points to the /tools
directory, the
sanity test would be carried out against the wrong Glibc. We can
force the script to check the Glibc we have just installed with the
following:
DL=$(readelf -l /bin/sh | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=$DL -o|" \
scripts/test-installation.pl
unset DL
In addition, there is a bug in the test-installation.pl
script in that it tries to
link a test program to a library that isn't installed by
make install. Issue
the following sed
command to fix it:
sed -i -e 's/"db1"/& \&\& $name ne "nss_test1"/' scripts/test-installation.pl
The ldd shell script
contains Bash-specific syntax. Change its default program
interpreter to /bin/bash in case another
/bin/sh is installed
as described in the
Shells chapter of the BLFS book:
sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
Fix a couple of bugs in Glibc that can cause crashes and core
dumps:
patch -Np1 -i ../glibc-2.14.1-fixes-1.patch
Fix a bug that prevents Glibc from building with GCC-4.6.2:
patch -Np1 -i ../glibc-2.14.1-gcc_fix-1.patch
Fix a stack imbalance that occurs under some conditions:
sed -i '195,213 s/PRIVATE_FUTEX/FUTEX_CLOCK_REALTIME/' \
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timed{rd,wr}lock.S
The Glibc documentation recommends building Glibc outside of the
source directory in a dedicated build directory:
mkdir -v ../glibc-build
cd ../glibc-build
As in Chapter 5, add the needed compiler flags to CFLAGS for x86
machines. Here, the optimization of the library is also set for the
gcc compiler to enhance compilation speed (-pipe) and package
performance (-O3).
case `uname -m` in
i?86) echo "CFLAGS += -march=i486 -mtune=native -O3 -pipe" > configparms ;;
esac
Prepare Glibc for compilation:
../glibc-2.14.1/configure --prefix=/usr \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.25 --libexecdir=/usr/lib/glibc
The meaning of the new configure options:
-
--libexecdir=/usr/lib/glibc
-
This changes the location of the pt_chown program from its
default of /usr/libexec
to
/usr/lib/glibc
.
Compile the package:
make
Important
In this section, the test suite for Glibc is considered critical.
Do not skip it under any circumstance.
Before running the tests, copy a file from the source tree into our
build tree to prevent a couple of test failures, then test the
results:
cp -v ../glibc-2.14.1/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log
You will probably see an expected (ignored) failure in the
posix/annexc test. In
addition the Glibc test suite is somewhat dependent on the host
system. This is a list of the most common issues:
-
The nptl/tst-clock2,
nptl/tst-attr3, 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 genuine Intel or authentic
AMD processor.
-
If you have mounted the LFS partition with the noatime
option, the
atime test will fail.
As mentioned in Section 2.4,
“Mounting the New Partition”, do not use the
noatime
option while
building LFS.
-
When running on older and slower hardware or on systems under
load, some tests can fail because of test timeouts being
exceeded. Modifying the make check command to set a
TIMEOUTFACTOR is reported to help eliminate these errors
(e.g. TIMEOUTFACTOR=16 make -k
check).
-
Other tests known to fail on some architectures are
posix/bug-regex32, misc/tst-writev, elf/check-textrel,
nptl/tst-getpid2, and stdio-common/bug22.
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
Install the package:
make install
Install NIS and RPC related headers that are not installed by
default; these are required by several BLFS packages:
cp -v ../glibc-2.14.1/sunrpc/rpc/*.h /usr/include/rpc
cp -v ../glibc-2.14.1/sunrpc/rpcsvc/*.h /usr/include/rpcsvc
cp -v ../glibc-2.14.1/nis/rpcsvc/*.h /usr/include/rpcsvc
The locales that can make the system respond in a different
language were not installed by the above command. None of the
locales are required, but if some of them are missing, test suites
of the 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_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 ja_JP -f EUC-JP ja_JP
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.14.1/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.14.1/localedata/SUPPORTED
file in the
unlikely case you need them.
6.9.2. Configuring Glibc
The /etc/nsswitch.conf
file needs to
be created because, although Glibc provides defaults when this file
is missing or corrupt, the Glibc defaults do not work well in a
networked environment. The time zone also needs to be configured.
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
One way to determine the local time zone, 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 timezones 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 --remove-destination /usr/share/zoneinfo/<xxx>
\
/etc/localtime
Replace <xxx>
with
the name of the time zone selected (e.g., Canada/Eastern).
The meaning of the cp option:
-
--remove-destination
-
This is needed to force removal of the already existing
symbolic link. The reason for copying the file instead of
using a symlink is to cover the situation where /usr
is on a separate partition. This could
be important when booted into single user mode.
6.9.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 /etc/ld.so.conf.d