2022-05-23
今天写了个TCP监控程序,想试试能不能交叉编译到其他平台。比如我的安卓手机(arrch64/arm架构)。
按照官网给的编译教程,先安装编译的工具:
rustup target add aarch64-unknown-linux-gnu然后使用命令检查编译构建arrch64平台应用:
cargo build --release --target=aarch64-unknown-linux-gnu果不其然,报错了。
...
error: linking with `cc` failed: exit status: 1
...
查阅资料发现需要在~/.cargo/config中加入
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
此外还得安装aarch64-linux-gnu-gcc,我使用pacman很轻松的安装上了。之后成功编译。我迫不及待的将程序发送到我的手机上,在termux中运行。然而运行不了。提示“No
such file or
directory”,当然程序是存在的且有运行权限。经验告诉我,这应该是程序平台架构不符。我使用file命令查看文件,得到的信息:
ttccpp: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=a21fa7de1aec8979940695e98523aff8637d5541, for GNU/Linux 3.7.0, with debug_info, not stripped
但的确显示的是arrch64,64bit。于是我把代码发到termux中构建,得到能运行的程序文件。同样使用file命令查看:
tccpp2: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, not stripped
发现两者的不同点在interpreter,于是我发现手机中存在/system/bin/linker64但不存在/lib/ld-linux-aarch64.so.1,这是不能运行的原因。
最后尝试了其他选择的交叉编译,都报错了。知道问题所在,但不知道问题的解决方法。