前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LFS 系列】从零开始 DIY Linux 系统:(六)构建 LFS 系统 - Glibc-2.21

【LFS 系列】从零开始 DIY Linux 系统:(六)构建 LFS 系统 - Glibc-2.21

作者头像
Lucifer三思而后行
发布2021-10-08 16:35:49
5990
发布2021-10-08 16:35:49
举报

Glibc 软件包包含了主要的 C 函数库。这个库提供了分配内存、搜索目录、打开关闭文件、读写文件、操作字符串、模式匹配、基础算法等基本程序。

安装 Glibc

首先进入到源码目录,解压软件包:

代码语言:javascript
复制
cd /sources
tar xf glibc-2.21.tar.xz
cd glibc-2.21

有些 Glibc 程序会用到和 FHS 不兼容的 /var/db 目录来存储它们的运行时数据。打上如下的补丁让这些程序在 FHS 兼容的位置存储它们的运行时数据。

代码语言:javascript
复制
patch -Np1 -i ../glibc-2.21-fhs-1.patch

Glibc 的编译系统是自包含的,可以完美安装,尽管编译器的配置文件和链接器仍然指向 /tools。这在 Glibc 安装前没法调整,因为如果调整的话 Glibc 的 autoconf 测试将会提示错误,不符合我们实现一个干净构建的目标。

修正软件包里的一个会影响到 32 位架构系统的正则表达式:

代码语言:javascript
复制
sed -e '/ia32/s/^/1:/' \
    -e '/SSE2/s/^1://' \
    -i  sysdeps/i386/i686/multiarch/mempcpy_chk.S

Glibc 文档里建议在 Glibc 源代码目录之外的特定编译目录下编译:

代码语言:javascript
复制
mkdir -v ../glibc-build
cd ../glibc-build

配置 Glibc 准备编译:

代码语言:javascript
复制
../glibc-2.21/configure    \
    --prefix=/usr          \
    --disable-profile      \
    --enable-kernel=2.6.32 \
    --enable-obsolete-rpc

编译软件包:

代码语言:javascript
复制
make

通常会有一些测试不能通过,但是一般你可以忽略任何下面列出来的失败项。现在开始测试编译结果:

代码语言:javascript
复制
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 文件,这只是无关紧要的输出信息。

下面的方式可以避免这个警告:

代码语言:javascript
复制
touch /etc/ld.so.conf

???? 注意: 运行 Glibc 的测试套件是很关键的。在任何情况下都不要跳过这个测试。

安装软件包:

代码语言:javascript
复制
make install

为 nscd 安装配置文件并创建运行时目录:

代码语言:javascript
复制
cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

为 nscd 安装系统支持文件:

代码语言:javascript
复制
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 文件末尾。

下面的命令将安装能完美覆盖测试所需语言环境的最小集合:

代码语言:javascript
复制
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 文件里列出的所有语言环境(包括以上列出的所有语言环境以及其它更多),执行下面这个非常耗时的命令:

代码语言:javascript
复制
make localedata/install-locales

你需要的语言环境几乎不大可能没列在 glibc-2.21/localedata/SUPPORTED 文件中,但如果真的没有可以使用 localedef 命令创建和安装。

配置 Glibc

尽管 Glibc 在文件 /etc/nsswitch.conf 丢失或损坏的情况下会创建一个默认的,但是我们需要手动该创建文件,因为 Glibc 的默认文件在网络环境下工作时有问题。另外,也需要设置一下时区。

运行下面的命令创建一个新文件 /etc/nsswitch.conf:

代码语言:javascript
复制
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

安装时区数据:

代码语言:javascript
复制
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

一种确定本地时区的方式是运行下面的脚本:

代码语言:javascript
复制
tzselect

在询问了几个关于位置的问题后,脚本会输出所在时区的名字(比如 America/Edmonton)。在 /usr/share/zoneinfo 文件中也有其它一些可用时区,比如 Canada/Eastern 或 EST5EDT,这些时区并没有被脚本列出来但也是可以使用的。

然后运行下面的命令创建 /etc/localtime 文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF

如果需要的话,动态库加载器也可以查找目录并包含里面配置文件的内容。通常在这个包含目录下的文件只有一行字指向库目录。

运行下面的命令增加这个功能:

代码语言:javascript
复制
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

安装完成后清理工作:

代码语言:javascript
复制
cd ..
rm -rf glibc-build
rm -rf glibc-2.21
rm -rf 

本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装 Glibc
  • 配置 Glibc
  • 配置动态库加载器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档