LLVM交叉编译ARM64平台的程序

596 阅读1分钟

参考:www.cnblogs.com/Liuyaaa/p/1…
官方交叉编译说明文档 : clang.llvm.org/docs/CrossC…

查看当前安装的clang是否支持目标架构

image.png

下载交叉编译工具链

到linaro下载交叉编译工具链:
www.linaro.org/downloads
snapshots.linaro.org/gnu-toolcha…
有三个包:
image.png
其中:

  • gcc-linaro : 是交叉编译工具链;
  • runtime-gcc-linaro : 是运行时依赖的库,构建跟文件系统的时候需要;
  • sysroot-glib-linaro : 是交叉编译时需要的头文件以及库文件;

其中gcc-linaro解压后目录中也包含一个sysroot : aarch64-linux-gnu.

也可以到ARM官网下载交叉编译工具链:
developer.arm.com/downloads/-…

下载gcc-linaro并解压。

使用LLVM交叉编译ARM64的可执行程序

clang -v \ # -v 展示verbose日志,方便排错
      --target=aarch64-linux-gnu \  # 三元组指定目标架构
      --gcc-toolchain=./gcc-linaro-14.0.0-2023.06-x86_64_aarch64-linux-gnu \
      --sysroot=./gcc-linaro-14.0.0-2023.06-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc \
      -fuse-ld=lld \ # 使用lld作为链接器
      hello.c  -o hello

注意sysroot的路径,不是缺头文件就是缺库,或者缺crtbeginS.o,找了半天才摸索出来。

image.png image.png 将编译好的可执行程序拷贝到构造好的文件系统中:

mount -t ext4 -o loop ./buildroot-2024.11-rc3/output/images/rootfs.ext4 ./rootfs
sudo cp ./hello ./rootfs/root

启动虚拟机进行测试:

image.png

使用LLVM交叉编译ARM64的Linux Kernel

参见我的另一篇文章:使用LLVM交叉编译aarch64架构Linux Kernel的一些细节 - 知乎 (zhihu.com)

内核文档 : docs.kernel.org/kbuild/llvm…

make ARCH=arm64 O=build LLVM=1 defconfig 
make ARCH=arm64 O=build LLVM=1 -j$(nproc)

关于这个特性的讨论以及修改内容可以看看:github.com/ClangBuiltL…