Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9136692
  • 博文数量: 1725
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19840
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1725)

文章存档

2024年(1)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2009-02-06 15:26:54

编译前的预备知识与要点提示

Glibc-2.3.6 建议使用 GCC-4.0 编译,Glibc-2.4/2.5 建议使用 GCC-4.1 编译,Glibc-2.6 建议使用 GCC-4.2 编译。所有这些版本最低要求使用 GCC-3.4 编译。

编译 Glibc 时使用的内核头文件版本可以比实际运行 Glibc 的内核版本高。如果实际运行的内核版本比头文件版本高,那么新内核的新特性将无法使用。更多细节可以查看的跟帖部分。

不要在运行中的系统上安装 Glibc,否则将会导致系统崩溃,至少应当将新 Glibc 安装到其他的单独目录,以保证不覆盖当前正在使用的 Glibc 。

Glibc 不能在源码目录中编译,它必须在一个额外分开的目录中编译。这样在编译发生错误的时候,就可以删除整个编译目录重新开始。

在运行 configure 脚本时可以设置 CC CFLAGS LDFLAGS 环境变量来优化编译。语法:configure [OPTION]... [VAR=VALUE]...

需要注意的是有些测试项目假定是以非 root 身份执行的,因此我们强烈建议你使用非 root 身份编译和测试 Glibc 。

配置选项
下列选项皆为非默认值[特别说明的除外]

--exec-prefix
--bindir
--libdir
--libexecdir
--infodir
--datadir
--mandir
--program-prefix
--program-suffix
--program-transform-name
--host
--build
--target
--srcdir
--cache-file
--no-create
--silent
--version
这些选项的含义基本上通用于所有软件包,这里就不特别讲解了。
--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默认值为 "yes",而 Glibc-2.3.6 默认为--disable-add-ons
--enable-bind-now
在 DSO 载入时就进行重定位,而不是在调用时重定位。
--enable-bounded
启用使用运行时边界检查(比如数组越界),这样会降低运行效率,但能防止某些溢出漏洞。
--enable-check-abi
在"make check"时执行"make check-abi"。[提示]在我的机器上 enable 之后始终导致 make check 失败。
--disable-force-install
不强制安装当前新编译的版本(即使已存在的文件版本更新)。
--disable-hidden-plt
不隐藏内部的函数调用以避免 PLT 。[建议不要明确设置此选项]
--enable-kernel=VERSION
VERSION 的格式是 X.Y.Z,表示编译出来的 Glibc 支持的最低内核版本。VERSION 的值越高(不能超过内核头文件的版本),加入的兼容性代码就越少,库的运行速度就越快。
--enable-oldest-abi=ABI
启用老版本的应用程序二进制接口支持。ABI 是老 Glibc 的版本号。默认值大部分情况下为 --disable-oldest-abi ,建议明确指定为 --disable-oldest-abi
--enable-omitfp
编译时忽略帧指示器(使用 -fomit-frame-pointer 编译),并采取一些其他优化措施。忽略帧指示器可以提高运行效率,但是调试将变得不可用,并且可能生成含有 bug 的代码。使用这个选项还将导致额外编译带有调试信息的非优化版本的静态库(库名称以"_g"结尾)。
--disable-profile
禁用 profiling 信息相关的库文件编译。Glibc-2.3.6 默认为 enable,Glibc-2.4/2.5/2.6 默认为disable 。
--enable-stackguard-randomization
在程序启动时使用一个随机数初始化 __stack_chk_guard ,主要用来抵抗恶意攻击。
--disable-sanity-checks
真正的禁用线程(仅在特殊环境下使用该选项)。
--enable-static-nss
编译静态版本的NSS(Name Service Switch)库。不推荐这样做,因为连接到静态NSS库的程序不能动态配置以使用不同的名字数据库。
--disable-shared
不编译共享库(即使平台支持)。在支持 ELF 并且使用 GNU 连接器的系统上默认为 enable 。
--disable-versioning
不在共享库对象中包含符号的版本信息。这样可以减小库的体积,但是将不兼容依赖于老版本 C 库的二进制程序。[提示]在我的机器上使用此选项总是导致编译失败。
--with-binutils=DIR
强制指定编译时使用的 Binutils(as,ld) 的位置。
--with-cpu=CPU
在 gcc 命令行中加入"-mcpu=CPU"。鉴于"-mcpu"已经被反对使用,所以建议不要设置该选项,或者设为 --without-cpu 。
--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-fp
仅在硬件没有浮点运算单元并且操作系统没有模拟的情况下使用。x86 与 x86_64 的 CPU 都有专门的浮点运算单元。而且 Linux 有 FPU 模拟。简单的说,不要 without 这个选项!因为它会导致许多问题!
--with-headers=DIR
指定内核头文件的所在目录。
--without-selinux
禁用 SELinux 支持。
--without-tls
禁止编译支持线程本地存储(TLS)的库。使用这个选项将导致兼容性问题,建议不要明确指定该选项。
--without-__thread
即使平台支持也不使用TSL特性。建议不要明确指定该选项。
--with-xcoff
使用XCOFF对象格式(主要用于windows)。

编译与测试

使用 make 命令编译,使用 make check 测试。如果 make check 没有完全成功,就千万不要使用这个编译结果。需要注意的是有些测试项目假定是以非 root 身份执行的,因此我们强烈建议你使用非 root 身份编译和测试。

测试中需要使用一些已经存在的文件(包括随后的安装过程),比如'/etc/passwd','/etc/nsswitch.conf'之类。请确保这些文件中包含正确的内容。

安装与配置

使用 make install 命令安装。比如:make install LC_ALL=C

如果你打算将此 Glibc 安装为主 C 库,那么我们强烈建议你关闭系统,重新引导到单用户模式下安装。这样可以将可能的损害减小到最低。

安装后需要配置 GCC 以使其使用新安装的 C 库。最简单的办法是使用恰当 GCC 的编译选项(比如'-Wl,--dynamic-linker=/lib/ld-linux.so.2')重新编译 GCC 。然后还需要修改 specs 文件(通常位于'/usr/lib/gcc-lib/TARGET/VERSION/specs'),这个工作有点像巫术,调整实例请参考 LFS 中的两次工具链调整。

可以在 make install 命令行使用'install_root'变量指定安装实际的安装目录(不同于 --prefix 指定的值)。这个在 chroot 环境下或者制作二进制包的时候通常很有用。'install_root'必须使用绝对路径。

被'grantpt'函数调用的辅助程序'/usr/libexec/pt_chown'以 setuid 'root' 安装。这个可能成为安全隐患。如果你的 Linux 内核支持'devptsfs'或'devfs'文件系统提供的 pty slave ,那么就不需要使用 pt_chown 程序。

安装完毕之后你还需要配置时区和 locale 。使用 localedef 来配置locale 。比如使用'localedef -i de_DE -f ISO-8859-1 de_DE'将 locale 设置为'de_DE.ISO-8859-1'。可以在编译目录中使用'make localedata/install-locales'命令配置所有可用的 locale ,但是一般不需要这么做。

时区使用'TZ'环境变量设置。tzselect 脚本可以帮助你选择正确的值。设置系统全局范围内的时区可以将 /etc/localtime 文件连接到 /usr/share/zoneinfo 目录下的正确文件上。比如对于中国人可以'ln -s /usr/share/zoneinfo/PRC /etc/localtime'。

编译优化提示

由于 Glibc 是系统的两大核心之一(还有一个是内核),虽然 LFS 指导书反对优化编译,但很多玩家觉得不优化编译心有不甘。因此,下面有几个基于 gcc-4.0.4 + Binutils-2.17 + Linux-Libc-Headers-2.6.12.0 环境的实践提示。

能够通过 make check 的优化设置:

CPPFLAGS='-DNDEBUG'
CFLAGS='-O3 -finline-limit=400 -fomit-frame-pointer -falign-functions=32 -pipe -fno-bounds-check -march=pentium3 -maccumulate-outgoing-args -fforce-addr -fmerge-all-constants -fgcse-sm -fgcse-las -minline-all-stringops -ftree-loop-linear -fivopts -ftree-vectorize -fprefetch-loop-arrays -fweb -frename-registers -fbranch-target-load-optimize'
LDFLAGS='-s -Wl,-O1,--sort-common,-s,--enable-new-dtags,--as-needed'
[提示]建议AMD64打开 -frename-registers ; -freg-struct-return 虽然能通过测试但是却会导致GCC的测试程序出现"FAIL: gcc.dg/struct-ret-libc.c execution test"因此该优化选项未包含在其中。此外, -fbranch-target-load-optimize -fbranch-target-load-optimize2 不能同时使用。

不能通过编译或测试的 CFLAGS :-fvisibility=hidden -mfpmath=sse -malign-double -m128bit-long-double -mregparm=3 -msseregparm -ftracer --param max-gcse-passes=2 --param max-gcse-memory=100M -Wa,-R

与 CPU L1/L2 cache 有关的提示[对于AMD,cache是L1(皆为128K)+L2(256,512,1M,2M)的大小;对于Intel,cache是L2的大小]:
cache <= 512K 推荐使用 -finline-limit=200 -falign-functions=16
512K < cache <= 1M 推荐使用 -finline-limit=400 -falign-functions=32
cache > 1M 推荐使用 -finline-limit=600 -falign-functions=64
阅读(3678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~