How do I configure glibc in a separate build folder ?与 Glibc 安装指南

一、 How do I configure glibc in a separate build folder ?
configure: error: you must configure in a separate build directory

Take it one step at a time:

tar -zxvf glibsource.tar.gz
mkdir glibc-build -- This creates the directory where the compiled files end up.
cd glibc-build -- This is where you run your commands
../glibsource -dir/configure -- This puts all the make files, etc. in the glibc-build directory
Type make while you are still in the glibc-build directory

The config command needs to be '../glibc-2.4'/configure' or whateverthe directory of source code files is called. Sometimes I need to bemore specific. Hope this is the solution. Let me know.

二、GLIBC安装手册

三、Glibc 安装指南(适用于2.3.6/2.4/2.5/2.6)

由于论坛排版效果不理想,而且我也只在我的个人空间对文章进行后继更新,所以建议直接到我的空间查看:
《Glibc Binutils GCC 配置选项简介》

http://lamp.linux.gov.cn/Linux/Glibc...s-Install.html
-------------------------------------------------------------------------------



此文是我在写作《DIY一个实用的 Mini-LAPP 服务器》过程中整理的资料,考虑到Glibc的核心地位,因此特地把这部分内容抽取出来单独成文,以供 LFS 玩家参考。此部分内容来自于源码树下的 configure INSTALL FAQ 三个文件。

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

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'。可以在编译目录中使用'makelocaledata/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 executiontest"因此该优化选项未包含在其中。此外, -fbranch-target-load-optimize-fbranch-target-load-optimize2 不能同时使用。

不能通过编译或测试的 CFLAGS :-fvisibility=hidden -mfpmath=sse -malign-double-m128bit-long-double -mregparm=3 -msseregparm -ftracer --parammax-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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值