Glibc 2 HOWTO 中文版 <author>原作 Eric Green, <tt/ejg3@cornell.edu/<newline> 译者 Allex Juang, <tt/allex@ms2.accmail.com/ <date>1.5 版, 1998年 2月 8日 <abstract> <nidx>GNU C library (see glibc)</nidx> <nidx>glibc</nidx> 这份 glibc 2 HOWTO 内容包括在 Linux 系统上安装与使用第二版 GNU C Library。 </abstract> <toc> <sect>简介 <p> <sect1>关於 glibc 2 <p> <nidx>glibc!overview</nidx> Glibc 2 是最新版的 GNU C 函式库。 它目前不需修改就可以在 GNU Hurd,Linux i386, m68k, 以及 alpha 系统上执行, 而 2.1 版中将加入对 Linux PowerPC, MIPS, Sparc, Sparc 64 与 Arm 等系统的支援。未来将加入对其它架构及作业系统的支援。 在 Linux 上,glibc 2 是主要版本为 6 的 libc,也就是 Linux libc 5 的後继者。 Linux libc 的发展人员想以此逐渐取代 libc 5。 就 2.0.6 来看,glibc 已具有成熟产品的品质。 Glibc 2.1 版 (在不久的将来) 将加入更多的功能, 并移植到更多系统上,足够当作主流使用。 Glibc 2 有三个选择性的附加套件: <descrip> <tag/Crypt/UFC-crypt 加密套件。 由於出口限制所以要分离出来。 <tag/LinuxThreads/Posix 1003.1c &dquot;pthread&dquot; 介面的实作。 <tag/Locale data/包含制造使用 glibc 的 internationalization 功能所需 locale 资料档案的资料。 </descrip> 强烈建议安装 Cryt 与 LinuxThreads 这两个附加套件, 如果不安装的话,有可能会与其它系统上的函式库造成不相容的情形。 (假如你不想使用这两个附加套件的话, 那你必须在执行 configure 时加上 --disable-sanity-checks 的选项) <sect1>关於这份文件 <p> 这份文件涵盖如何在 Linux 系统上安装 glib 2, 适用对象是那些在 intel-based 机器上使用 libc 5 的使用者。 但是对於其它系统以及其它不同函式库 (如 glibc 1) 的使用者, 只要将这份文件中出现的档名以及系统架构名称作适当的代换, 应该也可得到些帮助。 这份 HOWTO 的最新版本的拷贝可在 <url url="http://sunsite.unc.edu/LDP" name="Linux Documentation Project"> 或是 <url url="http://www.imaxx.net/~thrytis/glibc/Glibc2-HOWTO.html"> 找到。 <sect1>这份文件的最新改变 <p> 1.5 与 1.4 版的差别: <itemize> <item>由 Ed Bailey 加入索引 <item>我的新电子邮件信箱位址 </itemize> 1.4 与 1.3 版的差别: <itemize> <item>将目前状态由实验性改成成熟产品。 <item>更新发展中的移植列表。 <item>更新最新版到 2.0.6。 </itemize> <sect>选择你的安装方式 <p> <nidx>glibc!installing</nidx> 有许多种方式安装 glibc,你可以安装成一个测试用的函式库, 将目前使用的函式库当作是内定的, 然後在编译程式的时候用不同的选项来试用新的函式库。 用这种安装方式以後可以轻易的移除 glibc。 (虽然用 glibc 连结的程式在移除 glibc 後都将不能使用) 另外,用这种方式安装,你必须由原始码重新编译, 并没有 binary distribution 可以安装成测试的函式库。 这样的安装请参照<ref id="test-install" name="安装成测试用的函式库">。 这份文件中所说的另一种方式则是将 glibc 安装成主要函式库。 所有新编译的程式都将会使用 glibc, 但是你也可以在编译时用不同的选项而将程式连结到旧的函式库。 你可以直接安装已经编译好的版本,也可以自己编译函式库。 假如想更改最佳化或是组态选项, 或是想加入已编译好的版本中未支援的 add-on 的话, 那你必需取得原始码并且自己编译,这个安装的过程请参照 <ref id="primary-install" name="安装成主要的 C 函式库"> Frodo Looijaard 描述了另一种 glibc 的安装方式。 他的方法是将 glibc 安装成次要的函式库, 然後设定交叉编译器 (cross compiler) 来使用 glibc。 这个方式比起这份文件中的测试安装要复杂的多,但是比较容易连结到 glibc。 这个方法在他的 <url url="http://huizen.dds.nl/~frodol/glibc/" name="Installing glibc-2 on Linux"> 文件中说明。 假如你现在使用的是 Debian 1.3, 但是不想为了 glibc 而升级到不稳定的版本, 那麽 <url url="http://www.gate.net/~storm/FAQ/libc5-libc6-Mini-HOWTO.html" name="Debian libc5 to libc6 Mini-HOWTO"> 会告诉你如何使用 Debian 的 package 来升级。 假如你要把 glibc 2 安装到一重要的系统上, 那也许你应使用测试的安装,或是在备用系统上试试看。 即使没有臭□,某些程式在编译之前仍然需要某些修改, 原因在於某些函式原型与型态上的改变。 <sect>取得函式库<label id="getting"> <p> <nidx>glibc!obtaining</nidx> Glibc 2 包含 glibc package 以及数个附加套件: LinuxThreads、 Locale 与 Crypt, 原始码在 <itemize> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.6.tar.gz"> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-linuxthreads-2.0.6.tar.gz"> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-localedata-2.0.6.tar.gz"> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.6.tar.gz"> </itemize> 你需要大约 150MB 的磁碟空间来作完全的编译与安装, 核心函式库的基本安装大约要 50MB。 2.0.6 并没有 binary 的 package, 2.0.4 的 binary package 只有 i386 及 m68k 的版本, 而 2.0.1 for alpha 则可以在以下地方找到: <itemize> <item>Intel x86: <itemize> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4.bin.i386.tar.gz"> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4.bin.i386.tar.gz"> </itemize> <item>Alpha: <itemize> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.1.bin.alpha-linux.tar.gz"> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.1.bin.alpha-linux.tar.gz"> </itemize> <item>m68k: <itemize> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4-m68k-linux.bin.tar.gz"> <item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4-m68k-linux.bin.tar.gz"> </itemize> </itemize> 由於 cypt 这个附加套件有出口限制,非美国使用者请到 <url url="ftp://ftp.ifi.uio.no/pub/gnu"> 取得。 如果你用的是 RedHat distribution, 那你可以从 <url url="ftp://ftp.redhat.com/pub/redhat/"> 取得 glibc2 的 rpm。 在 RedHat distribution 5.0 中, glibc 2 是主要的 C 函式库。 如果你用的是 Debian distribution,那你可以从 <url url="ftp://ftp.debian.org/debian/dists/unstable/main/"> 取得 glibc2 的 package。档名是 libc6。 Glibc 2 目前是 Debian 测试版的基本 package, 等到 Debian 2.0 出来之後将会是主要的 C 函式库。 <sect>安装成测试用的函式库<label id="test-install"> <p> <nidx>glibc!testing</nidx> 这一节的内容是关於如何将 glibc 2 安装成测试用的函式库。 所有编译的程式都连结到你目前的函式库, 除非你给了某些额外的参数才会连结到新的函式库。 由於路径被编译到某些档案中,你需要由原始码来安装这函式库。 <sect1>编译与安装 <p> <sect2>需求 <p> <nidx>glibc!testing!prerequisites</nidx> <itemize> <item>约 150 MB 的磁碟空间 <item>GNU make 3.75 <item>gcc >= 2.7.2 (最好是 2.7.2.1) <item>binutils 2.8.1 (假如是 alpha 你还需要 snapshot) <item>bash 2.0 <item>autoconf 2.12 (假如你更动了 configure.in) <item>texinfo 3.11 </itemize> 在一台安装有 64MB 记忆体 i586@133 的机器上, 编译完整的函式库 (包括附加套件) 大约须要 3 小时。 而在 i686@200 则须约一个半小时。 <sect2>解开原始码 <p> <nidx>glibc!testing!sources, extracting</nidx> 你必需由 archive 中取出原始码。如此才能编译它,最好的方式如下: <tscreen><verb> tar xzf glibc-2.0.6.tar.gz cd glibc-2.0.6 tar xzf ../glibc-linuxthreads-2.0.6.tar.gz tar xzf ../glibc-crypt-2.0.6.tar.gz tar xzf ../glibc-localedata-2.0.6.tar.gz </verb></tscreen> 这会将 linuxthreads、 crypt 与 localedata 等目录放至 glibc-2.0.6 的目录底下, 如此 configure 才可以找到这些 add-ons。 <sect2>设定组态 <p> <nidx>glibc!testing!configuring</nidx> 在 glibc-2.0.6 的目录底下,建立一个新的目录 compile,并且 cd 到 compile 底下, 所有的工作都会在这个目录中完成,这会简化後续的清除工作。 (发展者似乎并未让 'make clean' 作得很好) <tscreen><verb> mkdir compile cd compile </verb></tscreen> 执行 <tt>../configure</tt>。 要使用父加套件,你必需用 --enable-add-ons 指定, 例如说 --enable-add-ons=linuxthreads,crypt,localedata。 你也必需指定要安装的目录,/usr/i486-linuxglibc2 是个不错的选择, 这样的 configure 命令如下: <tscreen><verb> ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr/i486-linuxglibc2 </verb></tscreen> <sect2>编译与安装 <p> <nidx>glibc!testing!compiling</nidx> <nidx>glibc!testing!installing</nidx> 要编译与验证,执行 <tscreen><verb> make make check </verb></tscreen> 假如 'make check' 成功了,安装函式库: <tscreen><verb> make install </verb></tscreen> <sect1>更新 dynamic loader <p> <nidx>glibc!testing!dynamic loader, updating</nidx> <nidx>glibc!testing!ld.so.conf, updating</nidx> <enum> <item>建立连结, 从 <tt>ld.so</tt> 到 <tt>/lib/ld-linux.so.2</tt>: <tscreen><verb> ln -s /usr/i486-linuxglibc2/lib/ld-linux.so.2 /lib/ld-linux.so.2 </verb></tscreen> 当一个档案连结时,这个函式库是唯一一个位置固定的。 当稳定的版本出现的时候, 在 /lib 使用连结也会使得将 glibc 升级为主要函式库时更为轻松。 <item>修改 <tt>/etc/ld.so.conf</tt>。 你需要增加新的函式库所在的路径到档案的最後, 这路径应该是 <tt><prefix>/lib</tt>。 假如用以上的选择就应该是 <tt>/usr/i486-linuxglibc2/lib</tt>。 在你修改了 <tt>/etc/ld.so.conf</tt> 之後,执行: <tscreen><verb> ldconfig -v </verb></tscreen> </enum> <sect1>设定 gcc <p> <nidx>glibc!testing!gcc configuration</nidx> 安装的最後一步是更新 <tt>/usr/lib/gcc-lib</tt> 以使 gcc 知道如何使用新的函式库。 首先,你需要复制目前的组态,要知道目前的组态,使用 gcc 的 -v 选项: <tscreen><verb> % gcc -v Reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 </verb></tscreen> 这里,i486-unknown-linux 是目前所用的系统,2.7.2.2 则是目前版本。 你需要将 <tt>/usr/lib/gcc-lib/<系统></tt> 复制到新的测试系统目录: <tscreen><verb> cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxglibc2 </verb></tscreen> 到你的新系统目录以及版本目录下: <tscreen><verb> cd /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2 </verb></tscreen> 修改目录下的 <tt>specs</tt>。在这档案中, 将 <tt>/lib/ld-linux.so.1</tt> 换成 <tt>/lib/ld-linux.so.2</tt>, 你也必需要移去档案中所有的 <tt/%{...:-lgmon}/ 表示式, 因为 glibc 不使用 gmon 函式库来做 profile。 你可以在<ref id="specs" name="Specs 档□例">找到一个□例。 <sect1>更新标头档连结 <p> <nidx>glibc!testing!header files, updating</nidx> 你需要在你的 include 目录下建立连结到其它的 include 目录: <tscreen><verb> cd /usr/i486-linuxglibc2/include ln -s /usr/src/linux/include/linux ln -s /usr/src/linux/include/asm ln -s /usr/X11R6/include/X11 </verb></tscreen> 也许你有其它的函式库,例如说 ncurse, 而这些函式库会需要它们自己的标头档, 你应该从 <tt>/usr/include</tt> 复制或连结这些档案。 (有些函式库需要重新用 glibc2 来 compile,在这种情形下, 只要编译并且安装到 <tt>/usr/i486-linuxglibc2</tt>) <sect1>测试你的安装 <p> <nidx>glibc!testing</nidx> 要测试安装是否成功,建立一档案 glibc.c 如下: <tscreen><verb> #include <stdio.h> main() { printf("hello world!\n"); } </verb></tscreen> 用 &dquot;-b <安装目录> -nostdinc -I<安装目录>/include -I/usr/lib/gcc-lib/<新系统目录>/<gcc 版本>/include&dquot; 的选项编译: <tscreen><verb> % gcc -b i486-linuxglibc2 -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include glibc.c -o glibc </verb></tscreen> 使用 ldd 确定程式是用 glibc2 连结,而非旧有的 libc: <tscreen><verb> % ldd glibc libc.so.6 => /usr/i486-linuxglibc2/lib/libc-2.0.5.so (0x4000d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) </verb></tscreen> 如果通过编译,连结也确定, 并且执行时也产生 &dquot;hello world!&dquot; 的输出,那麽安装就成功了。 <sect>安装成主要函式库<label id="primary-install"> <p> <nidx>glibc!installation</nidx> 这一节的内容是关於将 glibc2 安装成你的主要 C 函式库。 任何你编译的新程式都将会连结到这一个函式库, 除非你用了特殊的编译选项来连结到其它的版本。 假如你是用 RedHat 或 Debian 并且已下载相关的 rpm 或 deb 档, 请参阅 RedHat 或 Debian 的安装说明,你可以直接跳过这一节。 <sect1>由原始码编译函式库<label id="compiling"> <p> <nidx>glibc!installation!compilation</nidx> 这一节解释如何由原始码编译 glibc 2 与附加套件。 如果你想要改变最佳化与组态选项或使用额外的套件,那你就必须编译函式库。 <sect2>需求 <p> <nidx>glibc!installation!prerequisites</nidx> <itemize> <item>约 150 MB 的磁碟空间 <item>GNU make 3.75 <item>gcc >= 2.7.2 (最好是 2.7.2.1) <item>binutils 2.8.1 (假如是 alpha 你需要 snapshot) <item>bash 2.0 <item>autoconf 2.12 (假如你更动了 configure.in) <item>texinfo 3.11 </itemize> 在一安装有 64MB 记忆体的 i586@133 机器上, 编译完整的函式库与附加套件大约需要三个小时。 而在 i686@200 的机器上则约需要一个半小时。 <sect2>解开原始码 <p> <nidx>glibc!installation!sources, extracting</nidx> 你需要从 archive 中解出原始码才能编译它, 最好的方式是: <tscreen><verb> tar xzf glibc-2.0.6.tar.gz cd glibc-2.0.6 tar xzf ../glibc-linuxthreads-2.0.6.tar.gz tar xzf ../glibc-crypt-2.0.6.tar.gz tar xzf ../glibc-localedata-2.0.6.tar.gz </verb></tscreen> 这将会把 linuxthreads、crypt 与 localedata 等目录放到 glibc-2.0.6 目录下, 如此 configure 才能找到这些附加套件。 <sect2>设定组态 <p> <nidx>glibc!installation!configuration</nidx> 在 <tt>glibc-2.0.6</tt> 的目录底下,建立一个新的目录 compile, 并且 cd 到 compile 底下,所也的工作都会在这个目录中完成, 这会简化後续的清除工作。 (发展者似乎并未让 'make clean' 作得很好) <tscreen><verb> mkdir compile cd compile </verb></tscreen> 执行 <tt>../configure</tt>。 要使用附加套件你必需用 --enable-add-ons 来指定, 例如 --enable-add-ons=linuxthreads,crypt,localedata。 也许你也会想要指定安装的目录,要符合 linux 标准架构, 指定为 --prefix=/usr。 (当在 linux 系统上 prefix 被设为 <tt>/usr</tt>, configure 知道要调整其它的路径, 好将 libc.so 以及其它重要的函式库放到 <tt>/lib</tt>) 完整的 configure 命令如下: <tscreen><verb> ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr </verb></tscreen> <sect2>编译 <p> <nidx>glibc!installation!compilation</nidx> 要编译与验证, 执行: <tscreen><verb> make make check </verb></tscreen> <sect1>准备安装 <p> <nidx>glibc!installation!preparation for</nidx> 无论是由原始码编译或是预先编译好的版本,你现在必需移动某些档案来迎接新的函式库。 任何新编译的程式会被连结到 glibc,但是旧有静态连结的程式仍然倚靠著 libc 5, 所以你不能只是覆盖掉旧有的版本。 <enum> <item>建立一个新的目录来放置旧档案: <tscreen><verb> mkdir -p /usr/i486-linuxlibc5/lib </verb></tscreen> <item>旧的标头档必需从 <tt>/usr/include</tt> 移开: <tscreen><verb> mv /usr/include /usr/i486-linuxlibc5/include </verb></tscreen> <item>建立一个新的 include 目录,并且设定到其它 include 目录的连结: <tscreen><verb> mkdir /usr/include ln -s /usr/src/linux/include/linux /usr/include/linux ln -s /usr/src/linux/include/asm /usr/include/asm ln -s /usr/X11R6/include/X11 /usr/include/X11 ln -s /usr/lib/g++-include /usr/include/g++ </verb></tscreen> 这些连结须要视你的系统而稍作调整。 最少在 Slackware 中,g++ 标头档案在 <tt>/usr/local/g++-include</tt>, 而 Debian 却放在 <tt>/usr/include/g++</tt>, 并且将 <tt>/usr/lib/g++-include</tt> 连结到 <tt>/usr/include/g++</tt>。 在後者的情形,你也许会想要将原始的 g++ include 目录移回到 <tt>/usr/include</tt>。 <item>回存所有额外的标头档与连结。 某些非标准的函式库会将档案放至 <tt>/usr/include</tt>, 或是在 <tt>/usr/include</tt> 放置一连结到它们的 include 目录下。 这些档案与连结必须回存,如此才可以正确的使用这些额外的函式库。 <item>将你的新函式库路径 (例如 <tt>/usr/i486-linuxlibc5/lib</tt>) 加入到 <tt>/etc/ld.so.conf</tt> 的<em>顶端</em>。 你最好要有 ld.so 1.8.8 或是更新的版本, 以避免在安装完 glibc 之後出现一些奇怪的讯息。 <item>搬移或复制所有的旧函式库到新的目录。 <tscreen><verb> mv /usr/lib/libbsd.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.a /usr/i486-linuxlibc5/lib mv /usr/lib/libgmon.a /usr/i486-linuxlibc5/lib mv /usr/lib/libm.a /usr/i486-linuxlibc5/lib mv /usr/lib/libmcheck.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.so /usr/i486-linuxlibc5/lib mv /usr/lib/libm.so /usr/i486-linuxlibc5/lib cp /lib/libm.so.5.* /usr/i486-linuxlibc5/lib cp /lib/libc.so.5.* /usr/i486-linuxlibc5/lib </verb></tscreen> 假如你的 <tt>/usr</tt> 与 <tt>/</tt> 是在不同的 partition 上, 那 <tt>libm.so.5</tt> 与 <tt>libc.so.5</tt> 应该用复制的非搬移, 因为一些用来启动 linux 的程式会需要这两个函式库, 因此必须要位在 root partition。 <item>将 <tt>/usr/lib/*.o</tt> 移到新的目录下。 <tscreen><verb> mv /usr/lib/crt1.o /usr/i486-linuxlibc5/lib mv /usr/lib/crti.o /usr/i486-linuxlibc5/lib mv /usr/lib/crtn.o /usr/i486-linuxlibc5/lib mv /usr/lib/gcrt1.o /usr/i486-linuxlibc5/lib </verb></tscreen> <item>在你的函式库移动後, 更新 library cache。 <tscreen><verb> ldconfig -v </verb></tscreen> </enum> <sect1>由预先编译好的套件安装 <p> <nidx>glibc!installation!precompiled binaries</nidx> 如果你是由一已预先编译好的 glibc 安装, 你必须: <tscreen><verb> cd / gzip -dc glibc-2.0.bin.i386.tar.gz | tar tvvf - gzip -dc glibc-crypt-2.0.bin.i386.tar.gz | tar tvvf - ldconfig -v </verb></tscreen> 如果你用的是不同的系统架构或是版本,请置换适当的档名。 <sect1>由原始码安装 <p> <nidx>glibc!installation!from source</nidx> 要由原始码安装, 执行: <tscreen><verb> make install ldconfig -v </verb></tscreen> <sect1>更新 gcc specs <p> <nidx>glibc!installation!gcc specs file, updating</nidx> 安装的最後一步 (不管你是由预先编译好的套件或是由原始码安装) 是更新 gcc 的 <tt>spec</tt> 档, 让你可以正确的连结你的程式。 要知道 gcc 所用的是那一个 spec 档, 如下输入: <tscreen><verb> % gcc -v reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 </verb></tscreen> 在这里,系统是 i486-unknown-linux, 而版本则是 2.7.2.2。 你必须将 <tt>/usr/lib/gcc-lib/<系统></tt> 复制到旧的系统目录下: <tscreen><verb> cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxlibc5 </verb></tscreen> 到原先的目录与版本目录下: <tscreen><verb> cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2 </verb></tscreen> 并修改在同一目录下的 <tt>specs</tt>。 将这档案中的 <tt>/lib/ld-linux.so.1</tt> 改成 <tt>/lib/ld-linux.so.2</tt>, 并且要将所有的 <tt/%{...:-lgmon}/ 表示式删除, 因为 glibc 不使用 gmon 函式库来做 profiling。 你可以在 <ref id="specs" name="Specs 档□例"> 找到一份 specs 档的□例。 <sect1>测试你的安装 <p> <nidx>glibc!installation!testing</nidx> 要测试安装是否正确, 请建立 glibc.c 如下: <tscreen><verb> #include <stdio.h> main() { printf("hello world!\n"); } </verb></tscreen> 并且 compile 这个程式: <tscreen><verb> % gcc glibc.c -o glibc </verb></tscreen> 使用 ldd 来查证这个程式是连结到 glibc2 而非你的旧 libc: <tscreen><verb> % ldd glibc libc.so.6 => /lib/libc.so.6 (0x4000e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) </verb></tscreen> 假如这个程式可以通过 compile,并且在执行後产生 &dquot;hello world!&dquot; 的输出,那麽表示已经安装成功。 <sect>使用非主要的 C 函式库编译程式 <p> <nidx>glibc!compiling with alternate library</nidx> 有些时候你会想要使用不同的函式库来编译你的程式,这一节会解释如何达成这个目的。 我会使用在前两节中所使用的目录与安装名称,记得要改变这些名称以符合你的设定。 <sect1>一个关於使用非主要 C 函式库的警告 <p> <nidx>glibc!compiling with alternate library!warning</nidx> 在你开始编译任何会在开机时用到的程式之前, 假如程式是动态连结,并且是在 non-root partition 被 mount 之前使用的话, 那所有连结用的函式库都必须在 root partition 上。 在前面的安装程序里,我们将 glibc 安装成主要的函式库, 而旧的函式库仍然保留在 <tt>/lib</tt>, <tt>/lib</tt> 会在 root partition 上, 也就是说,所有在开机时会用到的程式都能正常工作。 然而,若你的 <tt>/usr</tt> 是在不同的 partition 上, 且把 glibc 当成测试用的函式库,安装在 <tt>/usr/i486-linuxglibc2</tt>, 那除非 <tt>/usr</tt> 已经被 mount,否则所有你用 glibc 编译的程式都将不能使用。 <sect1>用测试安装的 glibc 编译程式 <p> <nidx>glibc!compiling with alternate library!glibc</nidx> 要用测试安装的 glibc 编译程式, 你必须要将 include 路径重设成 glibc 的 include 路径。 指定 &dquot;-nostdinc&dquot; 会取消正常 include 路径, 而 &dquot;-I/usr/i486-linuxglibc2/include&dquot; 则会指到 glibc 的 include 目录, 你也必须要指定 gcc 标准 include 目录, 通常是 <tt>/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include</tt>。 (这里假设你安装测试的函式库在 i486-linuxglibc2, 而 gcc 的版本是 2.7.2.2) 要用测试安装的 glibc 来连结,你必须指明 gcc 设定, 这是由 &dquot;-b i486-linuxglibc2&dquot; 这选项来达成。 对大部份的程式, 你可以简单的将其加入 makefile 的 <tt>$CFLAGS</tt> 与 <tt>$LDFLAGS</tt> 选项中: <tscreen><verb> CFLAGS = -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include -b i486-linuxglibc2 LDFLAGS = -b i486-linuxglibc2 </verb></tscreen> 假如你使用 configure 这个 script,在执行 configure 之前, 定义 shell 变数 <tt>$CFLAGS</tt> 与 <tt>$LDFLAGS</tt> (在 csh/tcsh 下用 env/setenv 在 sh/bash/其它之下用 set/export)。 这样产生的 makefile 应该会包含正确的 <tt>$CFLAGS</tt> 与 <tt>$LDFLAGS</tt>。 不过并非所有的 configure scrpt 都会去取得这些变数, 所以在执行完 configure 之後,你还是要检查一下 makefile, 假如需要的话,手动修改它。 假如你所要编译的程式只呼叫 gcc,(而不直接呼叫 cpp 或 binutils) 你可以使用以下的 script,省去每次指定所有选项的麻烦: <tscreen><verb> #!/bin/bash /usr/bin/gcc -b i486-linuxglibc2 -nostdinc \ -I/usr/i486-linuxglibc2/include \ -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include "$@" </verb></tscreen> 编译时你可以使用这个 script 而不是 gcc。 <sect1>当 glibc 是主要函式库时用 libc 5 编译程式 <p> <nidx>glibc!compiling with alternate library!libc 5</nidx> 当你已经将 glibc 安装成主要的函式库之後,又想用旧的函式库来编译程式的时候, 你必须将 include 路径重设成旧的路径。 指定 &dquot;-nostdinc&dquot; 将会使预设的路径无效, 而 &dquot;-I/usr/i486-linuxlibc5/include&dquot; 会将 include 的路径指到旧函式库的 include 路径, 你也必须要指定 &dquot;-I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include&dquot; 以含入 gcc 所需的 include 档。 注意要视你新的目录与 gcc 版本来调整这些路径。 要用旧的 libc 来做连结,你必须指定 gcc 所用的架构。 这是由 &dquot;-b i486-linuxlibc5&dquot; 这个选项所指定的。 对大部份的程式,你可以简单的将这些选项加入到 makefile 里的 <tt>$CFLAGS</tt> 与 <tt>$LDFLAGS</tt> 选项里: <tscreen><verb> CFLAGS = -nostdinc -I/usr/i486-linuxlibc5/include -I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include -b i486-linuxlibc5 LDFLAGS = -b i486-linuxlibc5 </verb></tscreen> 假如你使用 configure 这个 script, 在执行 configure 之前, 定义 shell 变数 <tt>$CFLAGS</tt> 与 <tt>$LDFLAGS</tt> (在 csh/tcsh 下用 env/setenv 在 sh/bash/或其它之下用 set/export)。 这样产生的 makefile 应该会包含正确的 <tt>$CFLAGS</tt> 与 <tt>$LDFLAGS</tt>。 不过并非所有的 configure scrpt 都会去取得这些变数, 所以在执行完 configure 之後,你还是要简检查一下 makefile, 假如需要的话,手动修改它。 假如你所要编译的程式只呼叫 gcc,(而不直接呼叫 cpp 或 binutils) 你可以使用以下的 script,省去每次指定所有选项的麻烦: <tscreen><verb> #!/bin/bash /usr/bin/gcc -b i486-linuxlibc5 -nostdinc \ -I/usr/i486-linuxlibc5/include \ -I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include "$@" </verb></tscreen> 编译时你可以使用这个 script 而不是 gcc。 <sect>编译 C++ 程式 <p> <nidx>glibc!C++ programs, compiling</nidx> 因为 libg++ 使用了部份的数学函式库,也就是说会连结到 libm。 由於你目前的 libg++ 是用旧版的函式库所建立的, 所以你必须重新用 glibc 来 compile libg++ 或是取得一份预先编译好的版本。 最新版的 libg++ source 与用 glibc 所连结的预先编译版可以在 <url url="ftp://ftp.yggdrasil.com/private/hjl/"> 找到。 <sect1>用测试的 C 函式库安装 libg++ <p> <nidx>glibc!libg++, installing!as test library</nidx> 假如你已经将 glibc 安装成测试用的函式库,那你必须安装到 glibc 所安装的目录下 (例如由前一节所示的 <tt>/usr/i486-linuxglibc2</tt>)。 假如你要安装预先编译好的版本 (这也是我建议的安装方式,因为我一直都不能用这种方式成功地编译 libg++), 你必须将档案解到暂存的目录下, 将 <tt>usr/lib/</tt> 下的所有档案搬到 <tt><install directory>/lib/</tt>, 并将 <tt>usr/include/</tt> 下的所有档案搬到 <tt><install directory>/include/</tt> 下, (记得先删除 <tt>include/g++</tt> 这个连结!) 再将 <tt>usr/bin/</tt> 下的档案搬到 <tt><install directory>/bin/</tt>。 <sect1>在主要 glibc 下安装 libg++ <p> <nidx>glibc!libg++, installing!as primary library</nidx> 若你已经将 glibc 安装成主要的函式库,假如还想要用旧的 libc 来编译 g++ 的程式, 那你必须先将旧的 libg++ 档案移至旧的 libc 的目录下。 也许最简单的方式就是如前一节用 libc 5 来安装一份新版的拷贝, 然後再正常安装 glibc 版。 <sect1>使用非主要的 C 函式库来编译 C++ 程式 <p> <nidx>glibc!C++ programs, compiling!with non-primary libc</nidx> 假如你想用非主要的 C 函式库来编译 C++ 程式, 那你必须要加入 g++ 的 include 目录。 在上面的例子中, 对测试用的 glibc 是 <tt>/usr/i486-linuxglibc2/include/g++</tt>, 而对主要 glibc 则是 <tt>/usr/i486-linuxlibc5/include/g++</tt>, 这通常都可以由添加至 <tt>$CXXFLAGS</tt> 这个变数来完成: <tscreen><verb> CXXFLAGS = -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include -I/usr/i486-linuxlibc5/include/g++ -b i486-linuxglibc2 </verb></tscreen> <sect>报告臭□ <p> <nidx>glibc!bugs, reporting</nidx> 假如你以为这函式库有错,请先阅读 FAQ,也许已经有人遇到过这个问题, 并且也已经有了简单的解决方法。 另外,你也应该查看 <tt>INSTALL</tt> 档中的 "Recommended Tools to Install the GNU C Library" 一节, 因为有些错误不在於 glibc 而是在於这些工具。 假设你找到了臭□,请先确定那的确是臭□。 一个判断的好方法是看看 glibc 的行为是否与其它的 C 函式库相同。 假如相同的话,那也许你是错的,而函式库是正确的。 (但也不一定如此) 假如不相同的话,那肯定两者之中有一个是错的。 接著,请到 <url url="http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl">, 并且查看臭□资料库,确定这个问题尚未有人提出。 你也应该看看 <tt>BUGS</tt> (内付於 libc 中) 所列出的目前已被发现的臭□。 一旦你确定找到了一只新的臭□,请试著将它缩小到最小的 test case。 就 C 函式库而言,你只需要将它缩小到单独一个函式呼叫(假如可以的话)。 这应该不是太困难的事。 最後一个步骤是就你的 test case 提出臭□报告。 要送出臭□报告,请包含你的 test case、你所得到的结果、你所期待的结果、 你认为可能的原因在那 (只要你曾想过的任何原因)、你的系统类别、你所使用的 GNU C 函式库、 GNU CC 编译器、GNU binutils 的版本。另外, 请附上执行 <tt>configure</tt> 时产生的 <tt>config.status</tt> 与 <tt>config.make</tt>, 这两个档案会在你执行 <tt>configure</tt> 时候的目录下。 所有的臭□报告都应该使用 <tt/glibcbug/ 这个 GNU libc 所附的 shell script 送至 <url url="mailto:bugs@gnu.org" name="bugs@gnu.org"> (旧的位址 <url url="mailto:bugs@gnu.ai.mit.edu" name="bugs@gnu.ai.mit.edu"> 也仍然可以使用)。 或是到 GNATS 网站上利用 <url url="http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl"> 这个介面来做。 你的建议与问题应该送到 <url url="mailto:bugs-glibc@prep.ai.mit.edu" name="bugs-glibc@prep.ai.mit.edu"> 这个邮递列表。 假如你没有阅读新闻群组 gnu.bug.glibc, 那麽你可以要求 <url url="mailto:bug-glibc-request@prep.ai.mit.edu" name="bug-glibc-request@prep.ai.mit.edu"> 加入这个列表。 请不要将 GNU C 函式库的臭□报告送到 <bug-gcc@prep.ai.mit.edu>, 这是为了 GNU CC 而设立的,而 GNU CC 与 GNU C 函式库是由不同人们的所维护的。 <sect>Specs 档□例<label id="specs"> <p> <nidx>glibc!GCC specs file, sample</nidx> 这里是一份 <tt>specs</tt> 的□例。这将使 gcc 用 glibc2 来编译与连结。 它应该位於 <tt>/usr/lib/gcc-lib/<新系统目录>/<gcc 版本></tt>. 假如你用的是 x86 的系统,那你也许可以直接将这一段复制到档案里去。 <tscreen><verb> *asm: %{V} %{v:%{!V:-V}} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} *asm_final: %{pipe:-} *cpp: %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} *cc1: %{profile:-p} *cc1plus: *endfile: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s *link: -m elf_i386 %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static}}} *lib: %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} *libgcc: -lgcc *startfile: %{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} *switches_need_spaces: *signed_char: %{funsigned-char:-D__CHAR_UNSIGNED__} *predefines: -D__ELF__ -Dunix -Di386 -Dlinux -Asystem(unix) -Asystem(posix) -Acpu(i386) -Amachine(i386) *cross_compile: 0 *multilib: . ; </verb></tscreen> <sect>杂项 <p> <nidx>glibc!miscellanea</nidx> <sect1>进一步的资料 <nidx>glibc!information resources</nidx> <p> <sect2>相关网页 <p> <nidx>glibc!information resources!WWW</nidx> <itemize> <item><url url="http://www.gnu.org/software/libc/libc.html" name="FSF's GNU C Library Home Page"> <item><url url="http://www.imaxx.net/~thrytis/glibc/" name="Using GNU Libc 2 with Linux"> <item><url url="http://huizen.dds.nl/~frodol/glibc/"name="Installing glibc-2 on Linux">. <item><url url="http://www.gate.net/~storm/FAQ/libc5-libc6-Mini-HOWTO.html" name="Debian libc5 to libc6 Mini-HOWTO">. </itemize> <sect2>新闻群组 <p> <nidx>glibc!information resources!newsgroups</nidx> <itemize> <item><htmlurl url="news:comp.os.linux.development.system" name="comp.os.linux.development.system"> <item><htmlurl url="news:comp.os.linux.development.apps" name="comp.os.linux.development.apps"> <item><htmlurl url="news:linux.dev.kernel" name="linux.dev.kernel"> <item><htmlurl url="news:gnu.bug.glibc" name="gnu.bugs.glibc"> </itemize> <sect2>邮递列表 <p> <nidx>glibc!information resources!mailing lists</nidx> <descrip> <tag/Glibc 2 Linux 讨论列表/ 这个邮递列表是为了让安装有 glibc,也就是新的 GNU C 函式库,的使用者讨论用的。 议题包括相容性的问题,以及在 linux/glibc 环境下程式的编译问题。 要订阅这个邮递列表, 请寄一封信至 <url url="mailto:Majordomo@ricardo.ecn.wfu.edu" name="Majordomo@ricardo.ecn.wfu.edu">, 信的内容为 "subscribe glibc-linux <your email address>"。 </descrip> <sect1>贡献者列表 <p> 大部份的资讯都是由 <url url="http://www.gnu.org/software/libc/libc.html" name="GNU Libc web page"> 以及 Ulrich Drepper 的 <drepper@gnu.ai.mit.edu> glibc 2 announcement 所偷来的, Andreas Jaeger <aj@arthur.rhein-neckar.de> 则提供了部份的臭□报告。 以下各位都曾对本文件提供相关资讯以及意见: <itemize> <item>Allex Juang<allex@ms2.accmail.com.tw> <item>Mark Brown <M.A.Brown-4@sms.ed.ac.uk> <item>Ulrich Drepper <drepper@gnu.ai.mit.edu> <item>Scott K. Ellis <ellis@valueweb.net> <item>Aron Griffis <agriffis@coat.com> <item>Andreas Jaeger <aj@arthur.rhein-neckar.de> <item>Frodo Looijaard <frodol@dds.nl> <item>Ryan McGuire <rmcguire@freenet.columbus.oh.us> <item>Shaya Potter <spotter@capaccess.org> <item>Les Schaffer <godzilla@futuris.net> <item>Andy Sewell <puck@pookhill.demon.co.uk> <item>Gary Shea <shea@gtsdesign.com> <item>Stephane <sr@adb.fr> <item>Jan Vandenbos <jan@imaxx.net> </itemize> 这份文件的翻译是由以下数人所完成的: <itemize> <item>中文: Allex Juang<allex@ms2.accmail.com.tw> <item>法文: Olivier Tharan <tharan@int-evry.fr> <item>日文: Kazuyuki Okamoto <ikko-@pacific.rim.or.jp> </itemize> <sect1>回馈 <p> 除了撰写这份 HOWTO、维护 <url url="http://www.imaxx.net/~thrytis/glibc" name="glibc 2 for Linux"> 这网页、并且在我的机器上使用之外,我与 glibc 计划完全无关, 我也不了解这方面的议题,但会尽可能的对寄给我的问题提供帮助。 我也很欢迎你提出任何的回馈、修正、或是建议,请将它们寄到 <url url="mailto:ejg3@cornell.edu" name="ejg3@cornell.edu">。 <sect1>Copyright. <P> 此份文件的版权属於 Eric Green,这份文件可以在 LDP 的执照下散布。 </article>