编译glibc(gcc)以及过程中遇到的一些错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/greenlight_74110/article/details/78350196

一定要按照configure ——> make ——> make install三步骤。

1、下载glibc,解压

原文中的glibc-ports是用来支持arm架构芯片的包,可以将包内文件移动到glibc-2.15/ports内编译安装,这里不再赘述

wget http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz
tar -zxvf  glibc-2.15.tar.gz

2、准备一个编译文件夹

mkdir glibc-2.15-build
cd glibc-2.15-build

3、配置configure

../glibc-2.15/configure  --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

4、编译安装

make
make install

顺便说一下,make的-j参数是个坑,虽然可以并行编译,但如果Makefile或依赖关系有问题,编译会出错。

5、检查软连接

编译成功后,glibc-2.15-build文件下会生成一个新的libc.so.6,这是一个软连接,而真实的lib文件是此目录下的libc.so。ll是ls -l的别名

ll libc.so.6

查看库文件

ll /lib64/libc*

可以看到2.12的旧库文件还在,多了2.15版本的库文件,而且软链接文件全部指向了2.15版本

查看glibc支持的版本

strings libc.so | grep GLIBC

下面总结了一下编译glibc遇到的错误。

  1. DLIBRARYPATH shouldn’t contain the current directory

    checking LD_LIBRARY_PATH variable... contains current directory
    configure: error: 
    *** LD_LIBRARY_PATH shouldn't contain the current directory when
    *** building glibc. Please change the environment variable
    *** and run configure again.

    出现这个错误的原因是由于环境变量的LDLIBRARYPATH中出现了当前目录,这对gcc编译来说是多余的。

    解决方法:

    export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/
    

    或者

    unset LD_LIBRARY_PATH
  2. 安装目录prefix没指定的错误:

    *** On GNU/Linux systems the GNU C Library should not be installed into
    *** /usr/local since this might make your system totally unusable.
    *** We strongly advise to use a different prefix.  For details read the FAQ.
    *** If you really mean to do this, run configure again using the extra
    *** parameter `--disable-sanity-checks'.

    出现这个错误的原因在于,如果没指定prefix,则系统把这个程序装在/usr/local目录下。但是,c标准库要求必须安装在与根文件系统相同的分区中,否则不能用。但是/usr这个挂载点可能处在外部的分区。

    解决方法就是指定prefix到/usr,这时候configure程序会自动把必须的内容装在/lib下(这个目录肯定与根目录同分区),扩展内容再装到/usr/lib下。

  3. 有些安装方法是编译时候指定的目录不是/usr,而是通过建立软链指向新的libc-2.14.so版本,在此过程中需要删除原来连接,建立新的软连接,但是此处有一个大坑,就是当你删除libc.so.6之后会导致系统命令不可用,如下在测试机中演示的错误过程:

    rm -rf /lib64/libc.so.6
    

接下来当你建立新的软链接时候,会发现ln命令不能用了。

ln -s /lib64/libc-2.14.so /lib64/libc.so.6
ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

当出现上面的状况时候,可以使用以下方法解决(假设libc-2.14.so已经拷贝到/lib64/目录下):

LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so /lib64/libc.so.6

当然如果升级失败,还可以使用下面命令还原至系统升级前的版本libc-2.12.so:

LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6

“LD_PRELOAD”是一个环境变量,定义在程序运行前优先加载的动态链接库,本处作用就是在执行后面的ln命令时,指定使用的glibc库,这样命令就可以正常使用了。

展开阅读全文

没有更多推荐了,返回首页