编译前的预备知识与要点提示
Glibc-2.3.6 建议使用 GCC-4.0 编译,Glibc-2.4/2.5 建议使用 GCC-4.1 编译,Glibc-2.6/2.7 建议使用 GCC-4.2 编译。所有这些版本最低要求使用 GCC-3.4 编译。
编译 Glibc 时使用的内核头文件版本可以比实际运行 Glibc 的内核版本高。如果实际运行的内核版本比头文件版本高,那么新内核的新特性将无法使用。更多细节可以查看的跟帖部分。
不要在运行中的系统上安装 Glibc,否则将会导致系统崩溃,至少应当将新 Glibc 安装到其他的单独目录,以保证不覆盖当前正在使用的 Glibc 。
Glibc 不能在源码目录中编译,它必须在一个额外分开的目录中编译。这样在编译发生错误的时候,就可以删除整个编译目录重新开始。
在运行 configure 脚本时可以设置 CC CFLAGS LDFLAGS 环境变量来优化编译。语法:configure [OPTION]... [VAR=VALUE]...
需要注意的是有些测试项目假定是以非 root 身份执行的,因此我们强烈建议你使用非 root 身份编译和测试 Glibc 。
配置选项
下列选项皆为非默认值[特别说明的除外]
- --help
--version
--silent
--cache-file=FILE
--config-cache
--no-create
--srcdir=DIR
--exec-prefix=EPREFIX
--bindir=DIR
--sbindir=DIR
--libexecdir=DIR
--sysconfdir=DIR
--sharedstatedir=DIR
--localstatedir=DIR
--libdir=DIR
--includedir=DIR
--oldincludedir=DIR
--datarootdir=DIR
--datadir=DIR
--infodir=DIR
--localedir=DIR
--mandir=DIR
--docdir=DIR
--htmldir=DIR
--dvidir=DIR
--pdfdir=DIR
--psdir=DIR
--build=BUILD
--host=HOST
- 这些选项的含义基本上通用于所有软件包,这里就不特别讲解了。
- --prefix=PREFIX
- 安装目录,默认为 /usr/local
Linux文件系统标准要求基本库必须位于 /lib 目录并且必须与根目录在同一个分区上,但是 /usr 可以在其他分区甚至是其他磁盘上。因此,如果指定 --prefix=/usr ,那么基本库部分将自动安装到 /lib 目录下,而非基本库部分则会自动安装到 /usr/lib 目录中。但是如果保持默认值或指定其他目录,那么所有组件都间被安装到PREFIX目录下。
- --enable-add-ons[=DIR1,DIR2,...]
- 编译DIR1,DIR2,...中的附加软件包。其中的"DIR"是附加软件包的目录名。未指定列表或指定为"yes"则编译所有源码树根目录下找到的附加软件包。Glibc-2.4/2.5/2.6/2.7默认值为"yes",而 Glibc-2.3.6 默认为--disable-add-ons 。
- --disable-shared
- 不编译共享库(即使平台支持)。在支持 ELF 并且使用 GNU 连接器的系统上默认为 --enable-shared 。[提示] --disable-static 选项实际上是无效的,静态库总是被无条件的编译和安装。
- --enable-bind-now
- 禁用"lazy binding",也就是动态连接器在载入 DSO 时就解析所有符号(不管应用程序是否用得到),默认行为是"lazy binding",也就是仅在应用程序首次使用到的时候才对符号进行解析。因为在大多数情况下,应用程序并不需要使用动态库中的所有符号,所以默认的"lazy binding"可以提高应用程序的加载性能并节约内存用量。然而,在两种情况下,"lazy binding"是不利的:①因为第一次调用DSO中的函数时,动态连接器要先拦截该调用来解析符号,所以初次引用DSO中的函数所花的时间比再次调用要花的时间长,但是某些应用程序不能容忍这种不可预知性。②如果一个错误发生并且动态连接器不能解析该符号,动态连接器将终止整个程序。在"lazy binding"方式下,这种情况可能发生在程序运行过程中的某个时候。某些应用程序也是不能容忍这种不可预知性的。通过关掉"lazy binding"方式,在应用程序接受控制权之前,让动态连接器在处理进程初始化期间就发现这些错误,而不要到运行时才出乱子。
- --enable-bounded
- 启用运行时边界检查(比如数组越界),这样会降低运行效率,但能防止某些溢出漏洞。
- --disable-force-install
- 不强制安装当前新编译的版本(即使已存在的文件版本更新)。
- --disable-hidden-plt
- 默认情况下隐藏仅供内部调用的函数,以避免这些函数被加入到过程链接表(PLT,Procedure Linkage Table)中,这样可以减小 PLT 的体积并将仅供内部使用的函数隐藏起来。而使用该选项将把这些函数暴露给外部用户。
- --enable-kernel=VERSION
- VERSION 的格式是 X.Y.Z,表示编译出来的 Glibc 支持的最低内核版本。VERSION 的值越高(不能超过内核头文件的版本),加入的兼容性代码就越少,库的运行速度就越快。
- --enable-oldest-abi=ABI
- 启用老版本的应用程序二进制接口支持。ABI 是老 Glibc 的版本号。默认值大部分情况下为 --disable-oldest-abi ,建议明确指定为 --disable-oldest-abi
- --enable-check-abi
- 在"make check"时执行"make check-abi"。[提示]在我的机器上始终导致check-abi-libm测试失败。
- --disable-versioning
- 不在共享库对象中包含符号的版本信息。这样可以减小库的体积,但是将不兼容依赖于老版本 C 库的二进制程序。[提示]在我的机器上使用此选项总是导致编译失败。
- --enable-omitfp
- 编译时忽略帧指示器(使用 -fomit-frame-pointer 编译),并采取一些其他优化措施。忽略帧指示器可以提高运行效率,但是调试将变得不可用,并且可能生成含有 bug 的代码。使用这个选项还将导致额外编译带有调试信息的非优化版本的静态库(库名称以"_g"结尾)。
- --disable-profile
- 禁用 profiling 信息相关的库文件编译。Glibc-2.3.6 默认为 enable,Glibc-2.4/2.5/2.6/2.7 默认为disable 。
- --disable-sanity-checks
- 真正的禁用线程(仅在特殊环境下使用该选项)。
- --enable-stackguard-randomization
- 在程序启动时使用一个随机数初始化 __stack_chk_guard ,主要用来抵抗恶意攻击。该选项仅存在于 2.4 及以上版本中。
- --enable-static-nss
- 编译静态版本的NSS(Name Service Switch)库。不推荐这样做,因为连接到静态NSS库的程序不能动态配置以使用不同的名字数据库。
- --with-headers=DIR
- 指定内核头文件的所在目录。
- --with-binutils=DIR
- 强制指定编译时使用的 Binutils(as,ld) 的位置。
- --without-cvs
- 不访问CVS服务器。推荐使用该选项,特别对于从CVS下载的的版本。
- --with-elf
- 指定使用 ELF 对象格式,建议在支持 ELF 的 Linux 平台上使用此选项明确指定。
- --with-gd=DIR
--with-gd-include=DIR
--with-gd-lib=DIR
- 强制指定 libgd 的安装目录(DIR/include和DIR/lib)。后两个选项分别指定包含文件和库目录。
- --with-gmp=DIR
- 强制指定 gmp 的安装目录。
- --without-selinux
- 禁用 SELinux 支持。
- --without-fp
- 仅在硬件没有浮点运算单元并且操作系统没有模拟的情况下使用。x86 与 x86_64 的 CPU 都有专门的浮点运算单元。而且 Linux 有 FPU 模拟。简单的说,不要 without 这个选项!因为它会导致许多问题!
- --without-tls
- 禁止编译支持线程本地存储(TLS)的库。使用这个选项将导致兼容性问题。
以下选项意义不大,一般不用考虑它们
- --without-__thread
- 即使平台支持也不使用TSL特性。建议不要使用该选项。
- --enable-all-warnings
- 在编译时显示所有编译器警告,也就是使用 -Wall 选项编译。
- --with-cpu=CPU
- 在 gcc 命令行中加入"-mcpu=CPU"。鉴于"-mcpu"已经被反对使用,所以建议不要设置该选项,或者设为 --without-cpu 。
- --with-xcoff
- 使用XCOFF对象格式(主要用于windows)。
- --x-includes=DIR
--x-libraries=DIR
- 分别指定 X 的头文件和库文件目录。
阅读(8231) | 评论(0) | 转发(0) |