The Glibc package contains the main C library. This library provides the basic routines for allocating memory, searching directories, opening and closing files, reading and writing files, string handling, pattern matching, arithmetic, and so on.
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.
The glibc-libidn tarball adds support for internationalized domain
names (IDN) to Glibc. Many programs that support IDN require the
full libidn library, not this add-on
(see
http://www.linuxfromscratch.org/blfs/view/svn/general/libidn.html).
Unpack the tarball from within the Glibc source directory:
tar -xvf ../glibc-libidn-2.5.tar.bz2 mv glibc-libidn-2.5 libidn
In the vi_VN.TCVN locale, bash enters an infinite loop at startup. It is unknown whether this is a bash bug or a Glibc problem. Disable installation of this locale in order to avoid the problem:
sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
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:
sed -i \
's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' \
scripts/test-installation.pl
Apply a patch to obtain various fixes that the upstream maintainers have provided:
patch -Np1 -i ../glibc-2.5-branch_update-2.patch
The ldd shell script contains Bash-specific syntax. Change it's 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
The Glibc documentation recommends building Glibc outside of the source directory in a dedicated build directory:
mkdir -v ../glibc-build cd ../glibc-build
Prepare Glibc for compilation:
../glibc-2.5/configure --prefix=/usr \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --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
In this section, the test suite for Glibc is considered critical. Do not skip it under any circumstance.
Test the results:
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 and tst-attr3 tests sometimes fail. The reason is not completely understood, but indications are that a heavy system load 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.
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
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, testsuites 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/de_DE charset-independent
locale definition with the /usr/share/i18n/charmaps/ISO-8859-1.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 de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro 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
In addition, install the locale for your own country, language and character set.
Alternatively, install all locales listed in the glibc-2.5/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.5/localedata/SUPPORTED file in the
unlikely case if you need them.
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.
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
# End /etc/ld.so.conf
EOF