注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

onefish资料库

成功要素---耐得住孤独!

 
 
 

日志

 
 

一次gcc和glibc升级  

2011-03-01 05:12:26|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
因为lfs6.3下的 gcc和glibc的版本不是最新的,所以便抽空将两者升级到最新的版本了,最新的版本分别是gcc-4.3.0和glibc-2.7。
去gnu 上下载gcc和glibc。

为了不破坏原有的工具链,我选择将gcc和glibc安装到/opt/gcc-4.3.0和/opt /glibc-2.7下了

首先安装gcc
  1. tar xf gcc-4.3.0.tar.gz
  2. mkdir gcc-build
  3. cd gcc-build
  4. ../gcc-4.3.0/configure --prefix=/opt/gcc-4.3.0 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++
  5. make
  6. make install

之后安装glibc,这是最复杂的。将glibc安装在/opt/glibc- 2.7下的一个好处是这样做不会对原有的glibc构成影响,因为若选择安装在/、/usr、/usr/local等位置,一些库文件会默认安装到 /lib下,有些库会默认安装到/usr/lib下,从而覆盖掉原有的glibc,这是我们所不希望的。glibc安装到/opt/glibc-2.7之 后,这个目录下会出现目录bin、etc、include、lib、 libexec、sbin、share等目录,其中bin和sbin目录是操作glibc的一些函数,它们一般是静态连接的,因此可以不依赖于别的动态库 而独立运行,etc目录下是配置文件,如ld.so.conf和ld.so.cache,include是glibc的头文件目录,lib是库的目 录,libexec则是库的一些辅助程序,share目录中是国际化和本地化的信息
  1. tar xf glibc-2.7.tar.gz
  2. mkdir glibc-build
  3. cd glibc-build
  4. CHOST="i686-pc-linux-gnu" CFLAGS="-O2" ../glibc-2.7/configure --prefix=/opt/glibc-2.7 --disable-profile --enable-add-ons --enable-kernel=2.6.0
  5. (CHOST="i686-pc-linux-gnu" CFLAGS="-O2" ../glibc-2.7/configure --prefix=/usr --disable-profile --enable-add-ons --enable-kernel=2.6.0 )
  6. make
  7. make install

这时安装完成,需要配置gcc和glibc

因为新的gcc应该 在新的glibc中查找头文件,而glibc的include中仅包含c的头文件,为此在/opt/glibc-2.7/include 中建立一些到/usr/include中的连接。将在/usr/include中但不在/opt/glibc-2.7/include中的目录在 /opt/glibc-2.7/include中建立符号连接;将在/usr/include中但不在/opt/glibc-2.7/include中的 头文件在/opt/glibc-2.7/include中建立符号连接

此时需要修改gcc的配置文件,来改变gcc的头文件搜索路径、库 文件查找路径、动态加载器:
  1. SPECS=$(dirname $(gcc -print-libgcc-file-name))/specs
  2. gcc -dumpspecs > $SPECS
  3. 修改$SPECS文件,在*cpp:一节中增加 -nostdinc -I/opt/glibc-2.7/include -I/opt/gcc-4.3.0/lib/gcc-lib/i686-pc-llinux-gnu/4.3.0/include -I/opt/gcc-4.3.0/include -I/opt/gcc-4.3.0/include/c++/4.3.0 -I/opt/gcc-4.3.0/include/c++/4.3.0/backwward -I/opt/gcc-4.3.0/include/c++/4.3.0/i686-pc-linux-gnu。这样就改变了预处理器的参数,禁止它搜索 标准的包含路径,而只让它搜索指定的路径
  4. 修改$SPECS文件中的*startfile:一节,修改其中的.o文件,去除它们后面的%s,在前面增加它们在gcc或glibc 中的完整路径
  5. 修改$SPECS文件中的*endfile:一节,修改其中的.o文件,去除它们后面的%s,在前面增加它们在gcc或glibc中的 完整路径,并在最后增加动态连接器的路径/opt/glibc-2.7/lib/ld-linux.so.2
  6. 修改$SPECS文件中的*link:一节,改变传给连接器的参数,在参数前增加-L/opt/glibc-2.7/lib
  7. 修改$SPECS文件中的*dynamic-linker:一节,将动态连接器改为/opt/glibc-2.7/lib/ld- linux.so.2

现在修改PATH环境变量如下:PATH=/opt/gcc-4.3.0/bin:/opt /glibc-2.7/bin:/opt/glibc- 2.7/sbin:$PATH,这样做是为了后面使用ldconfig刷新动态库的cache的时候使用的是新安装的glibc中的ldconfig

将/etc/ld.so.conf 文件复制到/opt/glibc-2.7/etc目录下,并将/opt/glibc-2.7/lib插入文件的开始处,之后运行ldconfig,将在库 的目录中建立一些符号连接,并生成/opt/glibc-2.7/etc/ld.so.cache文件

现在可以编写一个简单的程序测试一 下了
  1. cd ~
  2. echo "int main() {return 0;}" > test.c
  3. gcc -o test test.c
  4. ldd ./test

查看一下输出的结果,检查libc.so.6和ld-linux.so.2前是否为 /opt/glibc-2.7/lib,若是,则安装成功了

由于新生成的程序使用的是动态连接器/opt/glibc-2.7/lib /ld-linux.so.2,因此它们会被动态连接到新安装的glibc上,而对于老的程序,由于它们采用原有的动态连接器,而这些连接器只会查找原有 的glibc,因此即使升级失败,也不会导致系统崩溃

若想让新老程序都连接到新的glibc,可以用某个livecd光盘(我使用 busybox,呵呵,因为是静态连接的,不需要重新启动系统)引导系统,之后把原有的/lib改名,建立新的/lib为到/opt/glibc-2.7 /lib的符号链接。这样做有一定的风险,可能会导致某些程序无法启动。若是如此,可以用livecd启动机器后将链接删除,恢复原有的/lib
  评论这张
 
阅读(315)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017