Glibc 软件包包含了主要的 C 函数库。这个库提供了分配内存、搜索目录、打开关闭文件、读写文件、操作字符串、模式匹配、基础算法等基本程序。
安装 Glibc
首先进入到源码目录,解压软件包:
cd /sources tar xf glibc-2.21.tar.xz cd glibc-2.21
有些 Glibc 程序会用到和 FHS 不兼容的 /var/db 目录来存储它们的运行时数据。打上如下的补丁让这些程序在 FHS 兼容的位置存储它们的运行时数据。
patch -Np1 -i ../glibc-2.21-fhs-1.patch
Glibc 的编译系统是自包含的,可以完美安装,尽管编译器的配置文件和链接器仍然指向 /tools。这在 Glibc 安装前没法调整,因为如果调整的话 Glibc 的 autoconf 测试将会提示错误,不符合我们实现一个干净构建的目标。
修正软件包里的一个会影响到 32 位架构系统的正则表达式:
sed -e '/ia32/s/^/1:/' \ -e '/SSE2/s/^1://' \ -i sysdeps/i386/i686/multiarch/mempcpy_chk.S
Glibc 文档里建议在 Glibc 源代码目录之外的特定编译目录下编译:
mkdir -v ../glibc-build cd ../glibc-build
配置 Glibc 准备编译:
../glibc-2.21/configure \ prefix=/usr \ --disable-profile \ --enable-kernel=2.6.32 \ --enable-obsolete-rpc
编译软件包:
make
通常会有一些测试不能通过,但是一般你可以忽略任何下面列出来的失败项。现在开始测试编译结果:
make check
你可能会看到一些失败的测试项。Glibc 的测试套件对宿主系统有一定的依赖。
下面是当前版本 LFS 里最常见的问题:
- 测试项 tst/tst-cputimer1 和 rt/tst-cpuclock2 已知是通不过的。具体原因还不清楚,不过一些细微的时间问题可能导致这些测试失败。
- 如果你系统的 CPU 不是相对较新的 Genuine Intel 或 Authentic AMD 处理器,数学运算测试有时候会失败。
- 因为测试的时候还没有网络,测试项 posix/tst-getaddrinfo4 和 posix/tst-getaddrinfo5 将总是失败。
- 其它已知的在某些架构平台上会失败的测试项是 malloc/tst-malloc-usable 和 nptl/tst-cleanupx4。
在安装 Glibc 时会报错找不到 /etc/ld.so.conf 文件,这只是无关紧要的输出信息。
下面的方式可以避免这个警告:
touch /etc/ld.so.conf
📢 注意: 运行 Glibc 的测试套件是很关键的。在任何情况下都不要跳过这个测试。
安装软件包:
make install
为 nscd 安装配置文件并创建运行时目录:
cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd
为 nscd 安装系统支持文件:
install -v -Dm644 ../glibc-2.21/nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf install -v -Dm644 ../glibc-2.21/nscd/nscd.service /lib/systemd/system/nscd.service
上面的命令并没有安装可以让你的电脑用不同语言响应的语言环境。语言环境并不是必须的,只是如果有些语言环境缺失,后续的测试套件可能会跳过一些重要测试用例。
单独的语言环境可以用 localedef
程序安装。
例如,下面第一个 localedef 命令将 /usr/share/i18n/locales/cs_CZ 字符无关的语言环境定义和 /usr/share/i18n/charmaps/UTF-8.gz 字符表定义组合在一起,并将结果附加到 /usr/lib/locale/locale-archive 文件末尾。
下面的命令将安装能完美覆盖测试所需语言环境的最小集合:
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
另外,安装适合你自己国家、语言和字符集的语言环境。
或者,也可以一次性安装在 glibc-2.21/localedata/SUPPORTED 文件里列出的所有语言环境(包括以上列出的所有语言环境以及其它更多),执行下面这个非常耗时的命令:
make localedata/install-locales
你需要的语言环境几乎不大可能没列在 glibc-2.21/localedata/SUPPORTED 文件中,但如果真的没有可以使用 localedef 命令创建和安装。
配置 Glibc
尽管 Glibc 在文件 /etc/nsswitch.conf 丢失或损坏的情况下会创建一个默认的,但是我们需要手动该创建文件,因为 Glibc 的默认文件在网络环境下工作时有问题。另外,也需要设置一下时区。
运行下面的命令创建一个新文件 /etc/nsswitch.conf:
cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns myhostname networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf EOF
安装时区数据:
tar -xf ../tzdata2015a.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
一种确定本地时区的方式是运行下面的脚本:
tzselect
在询问了几个关于位置的问题后,脚本会输出所在时区的名字(比如 America/Edmonton)。在 /usr/share/zoneinfo 文件中也有其它一些可用时区,比如 Canada/Eastern 或 EST5EDT,这些时区并没有被脚本列出来但也是可以使用的。
然后运行下面的命令创建 /etc/localtime 文件:
ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
将命令中的 替换成你所在实际时区的名字(比如 Asia/Shanghai)。
配置动态库加载器
默认情况下,动态库加载器(/lib/ld-linux.so.2)会搜索目录 /lib 和 /usr/lib 查找程序运行时所需的动态库文件。
不过,如果库文件不在 /lib 和 /usr/lib 目录下,需要把它所在目录加到 /etc/ld.so.conf 文件里,保证动态库加载器能找到这些库。
通常有两个目录包含额外的动态库,/usr/local/lib 和 /opt/lib,把这两个目录加到动态库加载器的搜索路径中。
运行下面的命令创建一个新文件/etc/ld.so.conf:
cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib EOF
如果需要的话,动态库加载器也可以查找目录并包含里面配置文件的内容。通常在这个包含目录下的文件只有一行字指向库目录。
运行下面的命令增加这个功能:
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
安装完成后清理工作:
cd .. rm -rf glibc-build rm -rf glibc-2.21
本次分享到此结束啦~
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️