LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3914|回复: 25

升级主系统的GLIBC的讨论

[复制链接]
发表于 2004-12-20 08:49:42 | 显示全部楼层 |阅读模式
我在上一个贴子中讲到我在编译LFS系统时出错,想到升级主系统的GLIBC,
结果,主系统崩溃,后来有几位大侠提到升级主系统的GLIBC值得一试,
                        ~~~~~~~~~~~~~
  这句话什么意思啊,是不是主系统的GLIBC不能升级,或者说,一般情
下,主系统的GLIBC是不能升级的?为什么我升级GLIBC的时候系统崩溃,
该如何升级主系统的GLIBC?
发表于 2004-12-20 09:58:10 | 显示全部楼层
原则:不动glibc。

原因:所有东西都连接到glibc的。一旦动了,就不能用了。

结论:可以忽略我说的,继续吃螃蟹。或者考虑别的问题,放弃这个。
发表于 2004-12-20 10:04:03 | 显示全部楼层
确实,glibc因为都是函数库,其它的程序都是连接到此库中然后才能进行工作的。如果升级了,那么所有的连接都会有问题了。
但是看到其它的发行版也有提供glibc****rpm之类的。但是我以前进行rpm安装的时候也是不能升级成功的。
是否可以参考LFS的调整工具链的作法,在升级前先进行工具链的调整,然后再安装,安装之后,又将工具链给调整到正常的状态。
  这只是初步的想法,大家是否可以发挥集体的力量,集思文益,都来试一试是否可行。
发表于 2004-12-20 10:17:53 | 显示全部楼层
http://www.chinalinuxpub.com/doc ... tml#primary-install
这个文档也许有用。
回家再试试看是否可行。转摘如下:
[php]
Next Previous Contents
5. 安装成主要函数库

这一节的内容是关于将 glibc2 安装成你的主要 C 函数库。任何你编译的新程序都将会连结到这一个函数库,除非你用了特殊的编译选项来连结到其它的版本。

假如你是用 RedHat 或 Debian 并且已下载相关的 rpm 或 deb 档,请参阅 RedHat 或 Debian 的安装说明,你可以直接跳过这一节。

5.1 由源代码编译函数库

这一节解释如何由源代码编译 glibc 2 与附加套件。如果你想要改变最佳化与组态选项或使用额外的套件,那你就必须编译函数库。

需求

    * 约 150 MB 的磁盘空间
    * GNU make 3.75
    * gcc >= 2.7.2 (最好是 2.7.2.1)
    * binutils 2.8.1 (假如是 alpha 你需要 snapshot)
    * bash 2.0
    * autoconf 2.12 (假如你更动了 configure.in)
    * texinfo 3.11

在一安装有 64MB 内存的 i586@133 机器上,编译完整的函数库与附加套件大约需要三个小时。而在 i686@200 的机器上则约需要一个半小时。

解开源代码

你需要从 archive 中解出源代码才能编译它,最好的方式是:

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


这将会把 linuxthreads、crypt 与 localedata 等目录放到 glibc-2.0.6 目录下,如此 configure 才能找到这些附加套件。

设定组态

在 glibc-2.0.6 的目录底下,建立一个新的目录 compile,并且 cd 到 compile 底下,所也的工作都会在这个目录中完成,这会简化後续的清除工作。 (发展者似乎并未让 'make clean' 作得很好)

mkdir compile
cd compile


执行 ../configure。要使用附加套件你必需用 --enable-add-ons 来指定,例如 --enable-add-ons=linuxthreads,crypt,localedata。也许你也会想要指定安装的目录,要符合 linux 标准架构,指定为 --prefix=/usr。 (当在 linux 系统上 prefix 被设为 /usr, configure 知道要调整其它的路径,好将 libc.so 以及其它重要的函数炕锱到 /lib) 完整的 configure 命令如下:

../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr

编译

要编译与验证,执行:

make
make check


5.2 准备安装

无论是由源代码编译或是预先编译好的版本,你现在必需移动某些文件来迎接新的函数库。任何新编译的程序会被连结到 glibc,但是旧有静态连结的程序仍然倚靠著 libc 5,所以你不能只是覆盖掉旧有的版本。

   1. 建立一个新的目录来放置旧文件:

mkdir -p /usr/i486-linuxlibc5/lib


   2. 旧的标头档必需从 /usr/include 移开:

mv /usr/include /usr/i486-linuxlibc5/include


   3. 建立一个新的 include 目录,并且设定到其它 include 目录的连结:

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++


      这些连结须要视你的系统而稍作调整。最少在 Slackware 中,g++ 标头文件在 /usr/local/g++-include,而 Debian 却放在 /usr/include/g++,并且将 /usr/lib/g++-include 连结到 /usr/include/g++。在後者的情形,你也许会想要将原始的 g++ include 目录移回到 /usr/include。
   4. 回存所有额外的标头档与连结。某些非标准的函数库会将文件放至 /usr/include,或是在 /usr/include 放置一连结到它们的 include 目录下。这些文件与连结必须回存,如此才可以正确的使用这些额外的函数库。
   5. 将你的新函数库路径 (例如 /usr/i486-linuxlibc5/lib) 加入到 /etc/ld.so.conf 的顶端。你最好要有 ld.so 1.8.8 或是更新的版本,以避免在安装完 glibc 之后出现一些奇怪的讯息。
   6. 搬移或复制所有的旧函数库到新的目录。

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


      假如你的 /usr 与 / 是在不同的 partition 上,那 libm.so.5 与 libc.so.5 应该用复制的非搬移,因为一些用来启动 linux 的程序会需要这两个函数库,因此必须要位在 root partition。
   7. 将 /usr/lib/*.o 移到新的目录下。

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


   8. 在你的函数库移动後,更新 library cache。

ldconfig -v


5.3 由预先编译好的套件安装

如果你是由一已预先编译好的 glibc 安装,你必须:

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


如果你用的是不同的系统架构或是版本,请置换适当的文件名。

5.4 由源代码安装

要由源代码安装,执行:

make install
ldconfig -v


5.5 更新 gcc specs

安装的最后一步 (不管你是由预先编译好的套件或是由源代码安装) 是更新 gcc 的 spec 档,让你可以正确的连结你的程序。要知道 gcc 所用的是那一个 spec 档,如下输入:

% gcc -v
reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs
gcc version 2.7.2.2


在这里,系统是 i486-unknown-linux,而版本则是 2.7.2.2。你必须将 /usr/lib/gcc-lib/<系统> 复制到旧的系统目录下:

cd /usr/lib/gcc-lib/
cp -r i486-unknown-linux i486-linuxlibc5


到原先的目录与版本目录下:

cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2


并修改在同一目录下的 specs。将这文件中的 /lib/ld-linux.so.1 改成 /lib/ld-linux.so.2,并且要将所有的 %{...:-lgmon} 表示式删除,因为 glibc 不使用 gmon 函数库来做 profiling。你可以在 Specs 档范例 找到一份 specs 档的范例。

5.6 测试你的安装

要测试安装是否正确,请建立 glibc.c 如下:

#include <stdio.h>

main()
{
     printf("hello world!\n");
}


并且 compile 这个程序:

% gcc glibc.c -o glibc


使用 ldd 来查证这个程序是连结到 glibc2 而非你的旧 libc:

% ldd glibc
libc.so.6 => /lib/libc.so.6 (0x4000e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


假如这个程序可以通过 compile,并且在执行後产生 "hello world!" 的输出,那么表示已经安装成功。

Next Previous Contents
[/php]
发表于 2004-12-20 10:18:57 | 显示全部楼层
找到一份文档应该有用:
原文出自:http://www.chinalinuxpub.com/doc/howto/Glibc2-HOWTO-4.html
[php]
4. 安装成测试用的函数库

这一节的内容是关于如何将 glibc 2 安装成测试用的函数库。所有编译的程序都连结到你目前的函数库,除非你给了某些额外的参数才会连结到新的函数库。由於路径被编译到某些文件中,你需要由源代码来安装这函数库。

4.1 编译与安装

需求

    * 约 150 MB 的磁盘空间
    * GNU make 3.75
    * gcc >= 2.7.2 (最好是 2.7.2.1)
    * binutils 2.8.1 (假如是 alpha 你还需要 snapshot)
    * bash 2.0
    * autoconf 2.12 (假如你更动了 configure.in)
    * texinfo 3.11

在一台安装有 64MB 内存 i586@133 的机器上,编译完整的函数库 (包括附加套件) 大约须要 3 小时。而在 i686@200 则须约一个半小时。

解开源代码

你必需由 archive 中取出源代码。如此才能编译它,最好的方式如下:

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


这会将 linuxthreads、 crypt 与 localedata 等目录放至 glibc-2.0.6 的目录底下,如此 configure 才可以找到这些 add-ons。

设定组态

在 glibc-2.0.6 的目录底下,建立一个新的目录 compile,并且 cd 到 compile 底下,所有的工作都会在这个目录中完成,这会简化後续的清除工作。 (发展者似乎并未让 'make clean' 作得很好)

mkdir compile
cd compile


执行 ../configure。要使用父加套件,你必需用 --enable-add-ons 指定,例如说 --enable-add-ons=linuxthreads,crypt,localedata。

你也必需指定要安装的目录,/usr/i486-linuxglibc2 是个不错的选择,这样的 configure 命令如下:

../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr/i486-linuxglibc2


编译与安装

要编译与验证,执行

make
make check


假如 'make check' 成功了,安装函数库:

make install


4.2 更新 dynamic loader

   1. 建立连结,从 ld.so 到 /lib/ld-linux.so.2:

ln -s /usr/i486-linuxglibc2/lib/ld-linux.so.2 /lib/ld-linux.so.2


      当一个文件连结时,这个函数库是唯一一个位置固定的。当稳定的版本出现的时候,在 /lib 使用连结也会使得将 glibc 升级为主要函数库时更为轻松。
   2. 修改 /etc/ld.so.conf。你需要增加新的函数库所在的路径到文件的最后,这路径应该是 <prefix>/lib。假如用以上的选择就应该是 /usr/i486-linuxglibc2/lib。在你修改了 /etc/ld.so.conf 之后,执行:

ldconfig -v


4.3 设定 gcc

安装的最后一步是更新 /usr/lib/gcc-lib 以使 gcc 知道如何使用新的函数库。首先,你需要复制目前的组态,要知道目前的组态,使用 gcc 的 -v 选项:

% gcc -v
Reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs
gcc version 2.7.2.2


这里,i486-unknown-linux 是目前所用的系统,2.7.2.2 则是目前版本。你需要将 /usr/lib/gcc-lib/<系统> 复制到新的测试系统目录:

cd /usr/lib/gcc-lib/
cp -r i486-unknown-linux i486-linuxglibc2


到你的新系统目录以及版本目录下:

cd /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2


修改目录下的 specs。在这文件中,将 /lib/ld-linux.so.1 换成 /lib/ld-linux.so.2,你也必需要移去文件中所有的 %{...:-lgmon} 表示式,因为 glibc 不使用 gmon 函数库来做 profile。你可以在 Specs 档范例找到一个范例。

4.4 更新标头档连结

你需要在你的 include 目录下建立连结到其它的 include 目录:

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


也许你有其它的函数库,例如说 ncurse,而这些函数库会需要它们自己的标头档,你应该从 /usr/include 复制或连结这些文件。 (有些函数库需要重新用 glibc2 来 compile,在这种情形下,只要编译并且安装到 /usr/i486-linuxglibc2)

4.5 测试你的安装

要测试安装是否成功,建立一文件 glibc.c 如下:

#include <stdio.h>

main()
{
     printf("hello world!\n");
}


用 "-b <安装目录> -nostdinc -I<安装目录>/include -I/usr/lib/gcc-lib/<新系统目录>/<gcc 版本>/include" 的选项编译:

% 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


使用 ldd 确定程序是用 glibc2 连结,而非旧有的 libc:

% 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)


如果通过编译,连结也确定,并且执行时也产生 "hello world!" 的输出,那么安装就成功了。
[/php]
发表于 2004-12-20 18:19:57 | 显示全部楼层
大家都来试试吧。
偶正在当小白鼠。晚上试看看是否可以成功。具体情况就知道了。
发表于 2004-12-21 07:21:18 | 显示全部楼层
确实是可以了那个安装成为主用的函数库的可以。
运行都没有问题,只是编译安装别的程序还没有来得及测试。
发表于 2004-12-21 12:11:38 | 显示全部楼层
这个方法确实是可行的。但是这两篇文章都是关于从libc5升级到glibc6的。当然要根据具体情况做一些改动。
比如,你make install之后,还得做一下LFS第6章前面的,安装linux-header的。
还有就是有一些步骤也可以不用。
但是对于新手,最好还是不要升级的好,不可预测的事情随时可能发生。还得观察一段时间。
 楼主| 发表于 2004-12-21 13:35:47 | 显示全部楼层
一个菜菜的问题:
  是不是静态连接编译后就不需要GLIBC库的支持呢?
  如果是,那可不可以将所有的程序均静态连接呢?(比如说做一个小的LINUX的时候特别有用)
  
发表于 2004-12-21 16:11:08 | 显示全部楼层
静态连接出来的东西都大.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表