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的版本是否更改成功。

### 解决ARM架构下的`libc.so.6`问题 对于在ARM架构上遇到的`libc.so.6`相关问题,通常涉及的是GNU Cglibc),这是Linux系统中最常用的C标准实现之一。当提及`libc.so.6`时,实际上是指向这个特定版本的glibc共享对象文件。 如果目标是在ARM设备上安装或者修复该,则可以考虑如下几种方法: #### 方法一:利用包管理器安装预编译好的glibc 大多数基于Debian或RedHat系列的操作系统都提供了官方支持的软件仓,在这些环境中可以直接使用对应的包管理工具来获取适合当前系统的最新稳定版glibc。例如,在Ubuntu或其他衍生发行版中可以通过apt-get命令完成操作;而在CentOS/RHEL/Fedora等则应采用yum/dnf等方式来进行更新或重新安装[^1]。 ```bash sudo apt update && sudo apt install --reinstall libc6 ``` 此命令适用于基于Debian/Ubuntu的系统,它会尝试刷新本地索引并强制重装现有的glibc包,这有助于覆盖可能存在的损坏文件。 #### 方法二:手动下载并配置交叉编译环境 针对某些特殊场景,比如嵌入式开发板或是自定义ROM构建等情况,有时需要自行准备适配于指定硬件平台的glibc版本。此时就需要借助之前提到过的Android NDK中的toolchain资源,按照文档说明设置好相应的环境变量以便让编译过程能够顺利调用正确的工具链组件。之后再依据具体需求选择合适的源码分支进行编译安装。 需要注意的是,由于不同厂商可能会对基础做出定制化修改,因此建议优先查找是否存在现成的固件镜像可供刷机恢复正常使用状态,而不是盲目地去替换核心运行时依赖项以免造成更严重的兼容性障碍。 #### 方法三:检查现有路径与链接关系 有时候并非真的缺少了整个glibc套件而是仅仅因为加载顺序错误或者是软连接丢失所引起的暂时性找不到对应符号的情况。这时应当仔细核查LD_LIBRARY_PATH环境变量是否正确设置了指向实际存在`libc.so.6`副本的位置,并且确保不存在冲突性的多重定义干扰正常解析流程。另外还可以运用ldd工具辅助诊断动态链接状况,如下面的例子所示用于验证某个程序启动所需的外部依赖是否齐全有效[^3]。 ```bash export LD_LIBRARY_PATH=/path/to/custom/libs:$LD_LIBRARY_PATH ldd $(which your_program) ``` 上述指令序列先扩展了全局搜索范围然后再对其后的应用程序做一次全面扫描以确定其关联的所有共享能否被正确定位。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

harbap

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值