3.2. 您需要做的特别事项

由于您将要替换许多程序所依赖的基础库,您可以想象可能会出现的问题。

对我来说,一切都很顺利,直到我输入了 make install。大约在安装过程进行到一半时,我收到了一个错误,告诉我 rm 无法运行,并且我发现即使是像 cplsmvlntar 等常用命令也无法工作;所有这些命令都告诉我,它们无法找到所需的库部分。

但是有帮助可用。您可以强制编译程序时将库编译到程序中,这样程序就不需要从库中查找它们。

因此,在本章中,我们将把安装所需的所有实用程序编译成静态版本。

3.2.1. 您肯定需要的东西

3.2.1.1. GNU-Binutils

  1. 从以下位置获取最新版本:ftp.gnu.org/gnu/binutils;在撰写本文时,这是 2.14 版本

  2. 打开软件包
    tar xIvf binutils-2.14.tar.bz2

  3. 切换到该目录
    cd binutils-2.14

  4. 配置 Makefiles
    ./configure

  5. 编译源代码
    make

  6. 使用以下命令安装它们
    make install

如果您在编译 binutils 时遇到问题,涉及到 gettext 的问题(错误指示类似于:"undeclared reference to lib_intl" 或类似),请安装最新版本,可从 ftp.gnu.org/gnu/gettext 获取。

如果这没有帮助,请尝试禁用本地语言支持,方法是使用
./configure --no-nls

您不需要构建 binutils 的静态版本,尽管这样做没有坏处,但我遇到许多系统运行非常旧的版本,几乎每次都遇到错误,所以我认为在这里提及它们是一个好主意。

3.2.1.2. GNU make

make 命令负责编译源代码,调用 gcc 和编译所需的所有其他程序。由于如果新的 glibc 出现问题,您可能需要编译某些东西,因此最好使其为静态的,否则在出现错误后可能无法工作。

  1. ftp.gnu.org/gnu/make/ 下载源代码;在撰写本文时,当前版本为 3.80

  2. 解压源代码,例如。
    tar xIvf make-3.80.tar.bz2

  3. 切换到创建的目录
    cd make-3.80

  4. 注意确保二进制文件是静态构建的
    export CFLAGS="-static -O2 -g"

  5. 运行 configure 脚本
    ./configure

  6. 编译内容
    make

  7. 安装二进制文件
    make install

  8. 进行检查
    make -v
    您现在应该看到已安装的新版本。如果不是,请检查旧的二进制文件,并用指向新版本的符号链接替换它们。

恭喜!您又编译了另一个静态链接的程序。

3.2.1.3. GNU core-utils

core-utils 是诸如:cprmlnmv 等命令。如果在安装过程中出现错误,这些是帮助您重新启动系统的绝对必要条件,因此静态二进制文件在这里确实是必要的。

  1. 再次,从以下位置下载源代码 tarball:ftp.gnu.org/gnu/coreutils/;在撰写本文时,当前版本为 5.0。

  2. 解压它
    tar xIvf coreutils-5.0.tar.bz2

  3. 切换到该目录
    cd coreutils-5.0

  4. 注意确保二进制文件是静态构建的
    export CFLAGS="-static -O2 -g"

  5. 配置软件包
    ./configure

  6. 编译二进制文件
    make

  7. 并安装它们
    make install

  8. 验证是否使用了正确的 core-utils
    cp --version
    . 您应该看到正确的版本,否则删除任何旧的二进制文件,并用指向新版本的符号链接替换它们。

现在这些非常基本的工具的二进制文件是静态的,您可以确保在任何需要它们的时候它们都能工作。

3.2.1.4. GNU tar

您已经使用 GNU tar 解压缩了到目前为止编译和安装的所有程序。但是,在发生崩溃后,您可能需要编译 glibc 所需的另一个程序,在这种情况下(我自己也经历过!),手头有一个可工作的 tar 来解压缩丢失的程序非常有用。对于 tar,我们还需要注意 bz2 压缩算法,该算法未包含在 tar 的正常源代码发行版中。

  1. ftp.gnu.org/gnu/tar 获取 GNU tar 的源代码;在撰写本文时,最新版本为 1.13。

  2. 由于许多源代码 tarball 使用 bzip2 压缩,我们希望内置支持,而不是使用管道,因此请从以下位置获取补丁:ftp://infogroep.be/pub/linux/lfs/lfs-packages/4.1/tar-1.13.patch

  3. 通过调用以下命令解压源代码
    tar xzvf tar-1.13.tar.gz

  4. 将补丁复制到 tar 的源代码目录
    cp tar-1.13.patch tar-1.13/

  5. 应用补丁
    patch -Np1 -i tar-1.13.patch

  6. 设置编译器标志以生成静态二进制文件
    export CFLAGS="-static -O2 -g"

  7. 现在我们准备好配置了
    ./configure

  8. 使用以下命令编译
    make

  9. 下一步,安装软件包
    make install

  10. 快速检查以确保从现在开始使用新版本
    tar --version
    您刚刚安装的版本应该显示出来,否则请检查旧的二进制文件,并用指向新位置的符号链接替换它们。

如果您在执行 make 时遇到问题,请尝试关闭本地语言支持 (nls)。您可以通过使用以下选项调用 configure 来实现此目的
--disable-nls

注意: 在这个新版本的 tar 中,您必须使用-j开关来解压缩 .bzip2 文件,因此不再是
tar xIvf anyfile.tar.bz2
您现在必须使用
tar xjvf anyfile.tar.bz2
我不知道为什么更改了,但它工作正常。

3.2.1.5. Bash shell

我更喜欢 Bash 作为我的 shell;如果您使用不同的 shell,请确保在安装 glibc 之前已安装了它的静态版本。

  1. 从以下位置获取 Bash:ftp.gnu.org/gnu/bash/。下载您可以找到的最新版本;在撰写本文时,这是 2.05b 版本。

  2. 解压源代码树
    tar xzvf bash-2.05b.tar.gz
    这将创建一个名为bash-2.05b的目录,其中包含所有解压后的源代码。

  3. 转到目录
    cd bash-2.05a

  4. 设置一切以构建静态版本
    export CFLAGS="-static -O2 -g"

  5. 配置 makefiles
    ./configure
    如果您希望 Bash 中有一些特殊功能,请参阅
    ./configure --help
    以获取选项列表。

  6. 编译所有内容
    make

  7. 安装编译后的二进制文件
    make install
    这会将二进制文件安装到/usr/local/bin/.

  8. 确保没有其他版本遗留下来(例如在我的 Suse-Linux 中/bin/),方法是复制文件
    cp /usr/local/bin/bash /bin/
    我们在这里不使用符号链接,因为在启动时和启动 Bash 时,符号链接可能会出现问题。

您现在已经安装了 Bash 的静态版本。因此,二进制文件比平常大得多,但它在任何情况下都可以运行。

如果您喜欢使用其他 shell,您可以自由选择,但请确保它是静态链接的版本。欢迎通过电子邮件向我发送一种以静态版本构建您选择的 shell 的方法,并且很有可能它将在本文档的下一个修订版中实现。

3.2.2. 可能会派上用场的软件

3.2.2.1. Midnight Commander

Midnight Commander 是一个非常有用的文件管理器,支持许多不错的功能,例如透明解压缩打包文件、内置的复制、移动和其他常用命令,以及集成的编辑器。

要编译此软件,您需要安装 glib;在某些发行版中,情况已经是这样。如果您在 make 命令中收到错误,提示 ld 找不到 glib,您将需要首先安装此库。您可以从以下位置获取源代码:ftp.gnome.org/pub/gnome/sources/glib/2.2/,并且安装非常简单。

以下是构建 Midnight Commander 的步骤

  1. http://www.ibiblio.org/pub/Linux/utils/file/managers/mc/" 获取源代码;在撰写本文时,最新版本为 4.6.0。

  2. 解压源代码
    tar xzvf mc-4.6.0.tar.gz

  3. 切换到您刚刚创建的目录
    cd mc-4.6.0

  4. 设置配置文件
    ./configure

  5. 开始编译
    make

  6. 安装所有内容
    make install