
linux ARM 如何更新libc库
在进行嵌入是开发的时候,如果碰到 应用程序报告以下错误,
那么说明,你的嵌入式的系统 LIBC库版本过低。
这时候该怎么解决呢?
我再进行live555 开发的过程中就碰到了。
这时候,你可能需要选择比较低版本的交叉编译器,或者要选择低版本的开源库。
但是除了以上方法之外,没有其他办法呢?比如更新ARM 上的LIBC库呢?
答案是肯定的。
在PC上如果想要更新LIBC库,很简单,网上一搜一大堆。这里就简单介绍一下:
一 PC上更新LINUX LIBC库
1. 查看LIBC库支持的版本
strings /lib64/libc.so.6 |grep GLIBC2
2. 到 http://www.gnu.org/software/libc/libc.html 或 Index of /pub/gnu/libc下载你要的LIBC库。注意LIBC库不是越新越好。
3. 编译
tar xvf glibc-2.26.tar.gz
cd glibc-2.26
mkdir build
cd build
../configure --prefix=/usr/local/glibc-2.26 // 配置glibc并设置当前glibc-2.26安装目录
make -j4
make install
cp /usr/local/glibc-2.26/lib/libc-2.26.so /lib64/libc-2.26.so
mv /lib64/libc.so.6 /lib64/libc.so.6.bak
LD_PRELOAD=/lib64/libc-2.26.so ln -s /lib64/libc-2.26.so /lib64/libc.so.6
4. 如果最后一步报错,使用下面命令把软链接改回来:
LD_PRELOAD=/lib64/libc-2.26.so ln -s /lib64/libc-2.26.so /lib64/libc.so.6
5. 最后在查询以下libc 版本是否更新成功
二 嵌入式ARM 要如何更新LIBC库呢
嵌入式arm更新LIBC最直接的方法,当然是重新制作根文件系统了。但除了重新制作根文件系统之外就没有其他办法了吗?答案是否定的。
嵌入式ARM 要更新LIBC网上介绍的很少,我刚开始也碰到了很多很多坑。经过很多天的摸索现在在这里分享一下几个办法。
因为嵌入式ARM 由于性能原因,一般是不会有gcc 之类的交叉编译器的。虽然arm下没安装交叉编译器,但是并不代表不能安装。
下面我介绍一下嵌入式ARM更新LIBC的2种方法:
1.1 直接下载LIBC库,到嵌入式ARM中编译。(不建议)
如果你的开发板用的是Ubunt的根文件系统,那么恭喜你,你要更新LIBC库就变得很简单。以下只介绍Ubuntu根文件系统的更新方式。
1. 安装gcc编译器 输入apt-get install build-essential
2. 下载 libc 库
3. 编译安装(和PC安装没有什么区别),但是编译时间很长笔者编译了1个多小时才编译完成。
tar -zxvf glibc-2.26.tar.gz
cd glibc-2.26
mkdir build && cd build
apt-get install gawk bison -y
…/configure --prefix=/usr/local #会报错,让你加个参数
make
make install
1.2 从你PC上直接拷贝你交叉编译器的动态库文件到你的开发板下
1. 拷贝PC上使用的交叉编译器的 arm-linux-gnueabihf/libc/lib 目录下的所有 *so*文件到你ARM板上的/lib 目录或 /lib/arm-linux-gnueabihf/ 目录下:(TIPS小技巧,可以先把这些文件拷贝在一起然后在一并更新到开发板)
先把所有交叉编译工具的库先拷贝出来备用(如果直接拷贝将导致arm开发板直接crash)
cd /workdir/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/lib
cp *so* /arm/lib/arm-linux-gnueabi/ -d //-d 代表拷贝软连接
2. 拷贝PC上使用的arm-linux-gnueabihf/lib/ 目录下的所有 *so*到开发板上
cd /workdir/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/lib/
cp *so* /nfs/tmpfs/arm2.26-gcc -d
3. 拷贝PC使用的交叉编译工具的arm-linux-gnueabihf/libc/usr/lib 的所有 *so* 文件到开发板上
cd /workdir/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr/lib
cp *so* /nfs/tmpfs/2.26-usr-lib -d
4. 更新开发板的动态链接库,
要更新动态链接库,那么必须推出ARM开发板当前运行的系统和跟文件系统。笔者采用的是nfs根文件系统更新ARM上的库。
4.1 进入Uboot 修改默认启动,从nfs启动Linux rootfs。
4.2 启动Linux后,在终端输入以下命令挂载跟文件系统和MMC的根文件系统。
mount -t nfs -o nolock 192.168.1.210:/nfs/tmpfs /mnt
mkdir /mnt/sd
mount /dev/mmcblk0p2 /mnt/sd
cd /mnt
4.3 为了防止更新错误,建议把 MMC上的 /lib /usr/lib 目录下的所有文件都备份一份
4.4 在ARM终端上执行命令开始拷贝库
cp /mnt/arm2.26-gcc/*so* /mnt/sd/lib/arm-linux-gnueabihf/ -d -rf
cp /mnt/2.26-usr-lib/*so* /mnt/sd/usr/lib/arm-linux-gnueabihf -d -rf
4.5 修改ld-linux-armhf.so.3 软连接, 用ls -l 查看 ld-linux-armhf.so.3 还是指向旧的libc库。
cd /mnt/sd/lib
rm -f ld-linux-armhf.so.3
ln -s arm-linux-gnueabihf/ld-2.26.so ld-linux-armhf.so.3
修改完后执行 sync 后,即可重新启动系统。
重启后用 strings /lib/arm-linux-gnueabihf/libc.so.6 | grep GLIBC_ 即可查看LIBC的版本是否更改成功。
更多推荐








所有评论(0)