关于在x86 Ubuntu系统交叉编译glibc 2.33的问题

前言

有一个QT项目,当我在x86架构的Ubuntu20.04虚拟机中运行的时候,是正常的;当我要把这个QT项目生成的可执行应用程序(交叉编译套件)运行在arm64架构的ubuntu系统中,就提示错误,如下图所示。

原因

是因为qt项目中的一些文件是依赖于GLIBC_2.33,但是在arm64架构的ubuntu系统中是没有的,这就需要在arm64架构的系统中安装GLIBC_2.33,限于arm64架构的系统缺少文件较多,所以,采取在x86的Ubuntu系统中交叉编译GLIBC_2.33的方法。

解决办法

1、确保交叉编译工具链已正确安装

可以参考虚拟机Ubuntu远程调试ARM开发板中的QT程序_ubuntu qt调试-CSDN博客

2、下载glibc需要的依赖项和配置文件,包括Linux 内核头文件、GMP等,由于我的系统中本身就存在GMP,所以这里只介绍Linux 内核头文件的安装。

        wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.119.tar.xz

        tar -xf linux-5.4.119.tar.xz

        cd linux-5.4.119

        make ARCH=arm64 INSTALL_HDR_PATH=/usr/aarch64-linux-gnu headers_install

安装完以后,就会在/usr/aarch64-linux-gnu/include下看到glibc需要的Linux 内核头文件了,这个路径后面会用到。

3、下载并编译、安装glibc-2.33。

        wget http://ftp.gnu.org/gnu/libc/glibc-2.33.tar.gz

        tar -xzvf glibc-2.33.tar.gz

        mkdir glibc-build

        cd glibc-build

        ../glibc-2.33/configure \

                --prefix=/opt/glibc-2.33

                --host=aarch64-none-linux-gnu \

                --with-headers=/usr/aarch64-linux-gnu/include \

其中,

--prefix 指定glibc的安装路径,安装完以后库文件就在此处。

--host指定目标系统的主机类型,即生成的二进制文件将运行的架构。这里,aarch64-none-linux-gnu 表示目标架构是 ARM 64-bit (AArch64)。

--with指定目标系统的内核头文件路径。编译 glibc 时需要使用这些头文件。此路径应该包含目标架构的内核头文件。

        make -j4

        make install

4、将生成的/opt/glibc-2.33下的库文件,主要是libc-2.33.so拷贝到arm架构的系统中的/lib/aarch64-linux-gnu中,并将libc.so.6软链接至libc-2.33.so,重启即可。可通过ldd --version 查看当前系统中的glibc的版本。

注意:

在将libc-2.33.so拷贝到arm架构的系统中的/lib/aarch64-linux-gnu中之前,不要轻易删除系统中之前的版本libc-2.31.so等以及libc.so.6,否则板子容易变砖。

  • 32
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值