您的位置:首页 > 其它

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

2017-10-26 10:16 721 查看
一定要按照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遇到的错误。

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


安装目录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下。

有些安装方法是编译时候指定的目录不是/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库,这样命令就可以正常使用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: