glibc 知:手册82:附录C:安装 GNU C 库

本文详细介绍了如何在GNU/Linux系统上安装和配置GNU C库(glibc),包括配置选项、编译步骤、安装过程以及推荐的编译工具。强调了如配置编译器、设置选项如--prefix、--enable-kernel等的重要性,并提到了测试、错误报告和特定平台的建议。此外,还讨论了针对不同架构和内核版本的兼容性要求。

1. 前言

The GNU C Library Reference Manual for version 2.35

2. 附录 C 安装 GNU C 库

Appendix C Installing the GNU C Library

在您执行任何其他操作之前,您应该阅读 https://sourceware.org/glibc/wiki/FAQ 上的常见问题解答。它回答了常见问题并描述了您在编译和安装时可能遇到的问题。

您将需要几个 GNU 工具的最新版本:肯定是 GCC 和 GNU Make,可能还有其他工具。请参阅下面的推荐编译工具。

2.1. 配置和编译 GNU C 库

Configuring and compiling the GNU C Library

GNU C 库不能在源目录中编译。您必须在单独的构建目录中构建它。例如,如果您在 /src/gnu/glibc-version 中解压了 GNU C 库源代码,请创建一个目录 /src/gnu/glibc-build 来放置目标文件。这允许删除整个构建目录,以防万一发生错误,这是重新开始的最安全方法,应该始终这样做。

在您的对象目录中,运行位于源代码树顶层的 shell 脚本配置。在上面的场景中,你会输入

$ ../glibc-version/configure args...

请注意,即使您在单独的构建目录中构建,编译可能需要在源目录中创建或修改文件和目录。

configure 有很多选项,但通常唯一必须的选项是“–prefix”。这个选项告诉 configure 你想把 GNU C 库安装在哪里。这默认为 /usr/local,但作为标准系统库安装的正常设置是 GNU/Linux 系统的“–prefix=/usr”和 GNU/Hurd 系统的“–prefix=”(一个空前缀) .

传递 ‘CC=compiler’ 和 CFLAGS=flags 参数来配置也可能很有用。CC 选择将使用的 C 编译器,CFLAGS 为编译器设置优化选项。所有编译所需的任何编译器选项,例如选择 ABI 或为其生成代码的处理器的选项,都应包含在 CC 中。GNU C 库构建系统可能会为特定文件覆盖的选项(例如优化和调试)应该放在 CFLAGS 中。CFLAGS 的默认值为‘-g -O2’,GNU C 库不经过优化就无法编译,因此如果指定了 CFLAGS,则必须启用优化。例如:

$ ../glibc-version/configure CC="gcc -m32" CFLAGS="-O3"

以下列表描述了配置的所有可用选项:

‘–prefix=directory’
在目录的子目录中安装与机器无关的数据文件。默认安装在 /usr/local 中。

‘–exec-prefix=directory’
在目录的子目录中安装库和其他机器相关文件。如果指定了该选项,则默认为“–prefix”目录,否则为 /usr/local。

‘–with-headers=directory’
在目录中查找内核头文件,而不是 /usr/include。GNU C 库需要来自内核头文件的描述内核接口的信息。GNU C 库通常会在 /usr/include 中查找它们,但如果您指定此选项,它将改为在 DIRECTORY 中查找。

此选项主要用于 /usr/include 中的头文件来自旧版本的 GNU C 库的系统。在这种情况下,偶尔会发生冲突。如果您想使用一组比 /usr/include 中找到的更新的内核头文件来编译 GNU C 库,您也可以使用此选项。

‘–enable-kernel=version’
此选项目前仅在 GNU/Linux 系统上有用。version 参数的格式应为 X.Y.Z,并描述生成的库预期支持的 Linux 内核的最小版本。版本号越高,添加的兼容代码越少,代码越快。

‘–with-binutils=directory’
使用目录中的 binutils(汇编器和链接器),而不是 C 编译器默认使用的那些。如果您系统上的默认 binutils 无法处理 GNU C 库中的所有结构,您可以使用此选项。在这种情况下,configure 会检测到问题并抑制这些结构,这样库仍然可以使用,但功能可能会丢失——例如,您不能使用旧的 binutils 构建共享 libc。

–with-nonshared-cflags=cflags’
使用额外的编译器标志 cflags 来构建库的部分,即使使用共享链接(即包含在 lib*_nonshared.a 库中的目标文件),这些部分也始终静态链接到应用程序和库中。构建过程将自动使用适当的标志,但此选项可用于设置构建应用程序和库所需的附加标志,以匹配本地策略。例如,如果此类策略要求所有链接到应用程序的代码必须使用源代码强化构建,‘–with-nonshared-cflags=-Wp,-D_FORTIFY_SOURCE=2’ 将确保编译 libc_nonshared.a 中的对象使用此标志(尽管在这种特殊情况下这不会影响生成的代码,并且可能仅更改调试信息和元数据)。

‘–with-rtld-early-cflags=cflags’
使用额外的编译器标志 cflags 来构建动态链接器的早期启动代码。这些标志可用于启用早期动态链接器诊断,以便在与 GNU C 库的其余部分不兼容的 CPU 上运行,例如,由于编译器标志针对后来的指令集架构 (ISA)。

‘–with-timeoutfactor=NUM’
指定一个整数 NUM 来调整测试程序的超时时间。可以使用 TIMEOUTFACTOR 环境变量在运行时更改此因素。

‘–disable-shared’
即使可能,也不要构建共享库。并非所有系统都支持共享库;您需要 ELF 支持和(当前)GNU 链接器。

‘–disable-default-pie’
不要将 glibc 程序和测试套件构建为与位置无关的可执行文件 (PIE)。默认情况下,glibc 程序和测试在支持它的目标上创建为与位置无关的可执行文件。如果工具链和架构支持它,静态可执行文件将构建为静态 PIE,生成的 glibc 可以与

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canpool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值