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版本
此时编译出来的可执行程序就可以再目标机器上正常运行了