1.下载aarch64-linux-gcc编译工具

下载地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads
在这里插入图片描述
这边有多个版本可供下载,我这边选择最新版本10.2版本进行下载
在这里插入图片描述

2.安装aarch64-linux-gcc工具

将下载好的安装包导入到虚拟机中,进行解压
xz -d gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar /可指定目录解压

3.配置aarch64-linux-gcc环境变量

在~/.bashrc中添加 PATH=$PATH:/usr/local/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin
$PATH:后面路径为gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu的解压路径

在这里插入图片描述
配置好后可以在任意目录下使用 aarch64-none-linux-gnu-gcc -v 来查看版本
在这里插入图片描述

4.在配置好aarch64-linux-gcc后发现编译出来的可执行程序不可以用

将代码进行交叉编译后发现可执行程序在目标机器上运行报错
在这里插入图片描述
使用 ldd a.out 查看可执行程序使用到的动态库,发现目标机器中的libm.so.6版本不支持
在这里插入图片描述
使用ldd --version查看虚拟机中和目标机器中的glibc版本,发现一个为2.19,一个为2.27
在这里插入图片描述
在这里插入图片描述
此问题表示只能引用更低版本的libm.so库版本,从目标机器上发现使用的libm.so库在/lib/aarch64-linux-gnu/目录下,我们可以把目标机器/lib目录下的aarch64-linux-gnu文件夹全部拷贝到虚拟机中的/lib/目录下

拷贝成功后在我们的Makefile中加入,指定libm.so的编译目录

LDFLAGS+=-L/lib/aarch64-linux-gnu/ -lm

编译出来后发现程序还是报错 version `GLIBC_2.29’ not found
在虚拟机中使用 objdump -p a.out 命令查看动态库引用的版本还是2.29版本
在这里插入图片描述
此时问题陷入阻塞,排除以上步骤都是正确的,为何版本引用没有成功

之后查看虚拟机中拷过来的aarch64-linux-gnu文件夹中的libm.so库发现软链接没有建立导致的
在这里插入图片描述
这里真正使用到的是文件夹下面的libm-2.1x.so,使用ln -s libm-2.1x.so libm.so建立一下软链接
在这里插入图片描述

软连接建立后再编译可执行程序 再使用 objdump -p a.out 命令查看libm.so库版本,发现将为了2.17版本
在这里插入图片描述
此时编译出来的可执行程序就可以再目标机器上正常运行了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐