目录
引言
在前面的博文(华为仓颉语言如何进行交叉编译-CSDN博客)介绍了如何在Linux平台上编译产生Windows代码,今天介绍一下如何在x86_64的Linux平台产生aarch64的Linux可执行文件。
工具链配置
x86_64的Linux软件包包括了x86_64下Linux和Windows所需要的开发包,但是没有包括aarch64的Linux所需要的文件,所以需要先现在aarch64的Linux的开发包。
配置aarch64的库文件
然后需要拷贝aarch64开发包中以下三个目录的文件到x86_64的Linux软件包的对应目录:
- cangjie/runtime/lib/linux_aarch64_llvm/
- cangjie/modules/linux_aarch64_llvm/
- cangjie/lib/linux_aarch64_llvm/
程序测试
编译程序(需要指定启动文件路径)
先编写了一个简单的 “Hello World” 仓颉程序,存放在名为 “hello_world” 的目录下,源文件为 “hello.cj”。
// hello.cj
main() {
println("你好,仓颉")
}
此时如果直接执行编译命令
cjc hello.cj --target aarch64-unknown-linux-gnu
会产生如下错误:
/usr/bin/aarch64-linux-gnu-ld: 找不到 Scrt1.o: 没有那个文件或目录
error: '/usr/bin/aarch64-linux-gnu-ld' '-o' '/home/developer/IDEProjects/main' '-z' 'noexecstack' '-m' 'aarch64linux' '--hash-style=both' '-dynamic-linker' '/lib/ld-linux-aarch64.so.1' '-pie' 'Scrt1.o' 'crti.o' 'crtbeginS.o' '-L/home/developer/cangjie/lib/linux_aarch64_llvm' '-L/home/developer/cangjie/runtime/lib/linux_aarch64_llvm' '-rpath-link' '/home/developer/cangjie/runtime/lib/linux_aarch64_llvm' '-T' '/home/developer/cangjie/lib/linux_aarch64_llvm/cjld.lds' '/home/developer/cangjie/lib/linux_aarch64_llvm/cjstart.o' '/tmp/cangjie-tmp-259RPEzqwyY-b234b9e1/hello.o' '--start-group' '-l:libcangjie-std-core.a' '--end-group' '-lcangjie-runtime' '-lsecurec' '-lm' '-lc' 'crtendS.o' 'crtn.o' : command failed (use -V to see invocation)
从中可以看到有一些负责启动的系统文件找不到。至少需要以下5个文件:
- Scrt1.o、crti.o和crtn.o文件在/usr/aarch64-linux-gnu/lib/目录下。
- crtbeginS.o和crtendS.o' '文件在/usr/lib/gcc-cross/aarch64-linux-gnu/11目录下。
此时需要使用--toolchain <value>或者-B <value>指定编译工具链中,二进制文件存放的路径。二进制文件包括:编译器、链接器、工具链等提供的 C 运行时目标文件(例如 crt0.o
、 crti.o
等)。在准备好编译工具链后,可以在将其存放在一个自定义路径,然后通过 --toolchain <value>
向编译器传入该路径,即可让编译器调用到该路径下的二进制文件进行交叉编译。
最终的命令行是这样的:
cjc hello.cj --target aarch64-unknown-linux-gnu -B /usr/aarch64-linux-gnu/lib/ -B /usr/lib/gcc-cross/aarch64-linux-gnu/11
编译完成后,会生成可执行文件main。 使用file命令检查一下确实生成了aarch64的文件。
developer@developer:~/IDEProjects$ file main
main: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
QEMU仿真运行
手上暂时没有aarch64的开发板,所以使用QEMU来模拟一下开发板。
首先安装一下qemu-user:
sudo apt-get install qemu-user
然后使用如下命令行
qemu-aarch64 -L /usr/aarch64-linux-gnu -E LD_LIBRARY_PATH=/home/developer/cangjie/runtime/lib/linux_aarch64_llvm ./main
程序可以正常运行:
结语
至此已经完成了在一个平台下编译仓颉语言支持的全部三个平台代码的工作。后续就可以全面地部署仓颉的工程了。