波折的,hexagon架构LLVM编译环境搭建
准备
toolchain for hexagon这是高通官方的hexagon架构编译工具链源码。是的没错你要自己编译这个环境。当然github上面也给出了编译好的release版本,开箱即用。经历一些波折之后我觉得似乎还是开箱即用比较方便(
搭建步骤大致如下:
- 下载依赖项源码
- 设置依赖项源码路径的环境变量
- 逐项编译
在本地构建
local文件夹下的README有提到方法
首先要先安装依赖项,这些依赖在dockerfile中有提到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| bison \ cmake \ flex \ rsync \ wget \ build-essential \ python-is-python3 \ python3.8 \ python3.8-venv \ curl \ xz-utils \ zstd \ ca-certificates \ ccache \ git \ software-properties-common \ bc \ ninja-build \ cpio \ python3-psutil \ unzip
|
cmake如果直接用apt管理器下载版本会太旧,因此需要从kitware下载。后面将在容器里搭建会讲到。
然后运行脚本
1 2 3 4 5 6 7 8 9 10
| ./get-src-repos.sh ${PWD} ${PWD}/install/manifest <-获取源码
cd llvm-test-suite git am ../test-suite-patches/0001-Add-cycle-read-for-hexagon.patch <-打个补丁
TOOLCHAIN_INSTALL=${PWD}/install \ ROOT_INSTALL=${PWD}/rootfs \ ARTIFACT_BASE=${PWD}/artifacts \ ARTIFACT_TAG=main \ ./build-toolchain.sh <-设置变量后运行编译脚本
|
编译好之后可以运行test-toolchain.sh
来检验,变量在build脚本的基础上加多一个TEST_TOOLCHAIN=1
即可。然后就可以使用hexagon-unknown-linux-musl-clang(++)
来编译项目了。默认是没有开PIE和canary的,partial relro。虽然hexagon是有类似保护机制的,还有待探究。
在容器构建
需要设置一个变量ARTIFACT_TAG
,可以划分版本。比如现在hexagon最新可稳定支持的版本是19.1.5。不同版本的源码可以在项目分支tags中找到。
1 2 3
| export ARTIFACT_TAG=19.1.5
./build-in-container.sh
|
这样就可以自动构建了。编译时间很长需要耐心等待。
dockerfile由于网络问题,有些地方需要进行修改。以下是我给出可以在国内正常下载的修改过的dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| FROM ubuntu:20.04@sha256:6d8d9799fe6ab3221965efac00b4c34a2bcc102c086a58dff9e19a08b913c7ef
ENV HOST_CLANG_VER 19 ENV PATH="/opt/zig-linux-x86_64-0.11.0:$PATH"
RUN sed -i "s/http:\/\/archive.ubuntu.com/http:\/\/mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list RUN apt update && \ DEBIAN_FRONTEND=noninteractive apt install -yy \ apt-transport-https ca-certificates \ eatmydata software-properties-common wget gpgv2 unzip && \ DEBIAN_FRONTEND=noninteractive eatmydata \ add-apt-repository ppa:deadsnakes/ppa && \ DEBIAN_FRONTEND=noninteractive eatmydata \ wget --quiet https://ziglang.org/download/0.11.0/zig-linux-x86_64-0.11.0.tar.xz && \ tar xf ./zig-linux-x86_64-0.11.0.tar.xz --directory /opt && \ wget https://apt.llvm.org/llvm.sh && \ chmod +x ./llvm.sh && \ bash -x ./llvm.sh ${HOST_CLANG_VER} && \ wget https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-linux.zip && \ unzip -d /usr/local/bin ninja-linux.zip && \ update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add - && \ apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' && \ apt-get update RUN update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${HOST_CLANG_VER} 100 && \ update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${HOST_CLANG_VER} 100 && \ DEBIAN_FRONTEND=noninteractive eatmydata apt update && \ DEBIAN_FRONTEND=noninteractive eatmydata \ apt install -y --no-install-recommends \ bison \ cmake \ flex \ rsync \ wget \ build-essential \ python-is-python3 \ python3.8 \ python3.8-venv \ curl \ xz-utils \ zstd \ ca-certificates \ ccache \ git \ software-properties-common \ bc \ ninja-build \ cpio \ python3-psutil \ unzip
RUN cat /etc/apt/sources.list | sed "s/^deb\ /deb-src /" >> /etc/apt/sources.list
RUN apt update && \ DEBIAN_FRONTEND=noninteractive eatmydata \ apt build-dep -yy --arch-only qemu clang python3
ARG QEMU_REPO ARG QEMU_REF=hexagon-sysemu-04-oct-2024
ARG ARTIFACT_BASE ARG ARTIFACT_TAG
ENV VER 19.1.5 ENV TOOLCHAIN_INSTALL /usr/local/clang+llvm-${VER}-cross-hexagon-unknown-linux-musl/ ENV ROOT_INSTALL /usr/local/hexagon-unknown-linux-musl-rootfs ENV MAKE_TARBALLS 1
ENV LLVM_SRC_URL https://github.com/llvm/llvm-project/archive/llvmorg-${VER}.tar.gz ENV LLVM_TESTS_SRC_URL https://github.com/llvm/llvm-test-suite/archive/llvmorg-${VER}.tar.gz ENV MUSL_SRC_URL https://github.com/quic/musl/archive/d125203fcb134febcde6ca32181554560b67c790.tar.gz ENV HEXMVM_SRC_URL https://github.com/quic/hexagonMVM/archive/v0.1.1.tar.gz ENV LINUX_SRC_URL https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.7.11.tar.xz ENV BUSYBOX_SRC_URL https://busybox.net/downloads/busybox-1.36.1.tar.bz2 ENV BUILDROOT_SRC_URL https://github.com/quic/buildroot/archive/hexagon-2024.11.26.tar.gz
ADD test-suite-patches /root/hexagon-toolchain/test-suite-patches ADD get-src-tarballs.sh /root/hexagon-toolchain/get-src-tarballs.sh ADD *.cmake /root/hexagon-toolchain/ RUN cd /root/hexagon-toolchain && ./get-src-tarballs.sh ${PWD} ${TOOLCHAIN_INSTALL}/manifest
ADD test_init/test_init.c test_init/Makefile /root/hexagon-toolchain/test_init/
ENV IN_CONTAINER 1 ADD build-toolchain.sh /root/hexagon-toolchain/build-toolchain.sh RUN cd /root/hexagon-toolchain && ./build-toolchain.sh ${ARTIFACT_TAG}
ADD build-buildroot.sh /root/hexagon-toolchain/build-buildroot.sh RUN cd /root/hexagon-toolchain && ./build-buildroot.sh
ARG TEST_TOOLCHAIN=1
ADD build-rootfs.sh /root/hexagon-toolchain/build-rootfs.sh RUN cd /root/hexagon-toolchain && ./build-rootfs.sh
ADD test-toolchain.sh /root/hexagon-toolchain/test-toolchain.sh RUN cd /root/hexagon-toolchain && ./test-toolchain.sh
|
开箱即用
目前(2024.12.12)release最高版本是19.1.2,musl的版本对应的是1.2.5,clang版本为19。这里以linux x86_64版本为例。
1 2 3
| wget https://artifacts.codelinaro.org/artifactory/codelinaro-toolchain-for-hexagon/19.1.2/clang+llvm-19.1.2-cross-hexagon-unknown-linux-musl_x86_64-linux-musl.tar.xz sudo tar xf clang+llvm-19.1.2-cross-hexagon-unknown-linux-musl_x86_64-linux-musl.tar.xz -C /path/to/install export PATH=/path/to/your/clang+llvm-19.1.2-cross-hexagon-unknown-linux-musl/x86_64-linux-musl/bin:$PATH
|
解压过程有点久。整个包大小解压后在29G左右,请预留好空间。接下来就可以正常编译程序了。
1
| hexagon-linux-musl-clang -o ./example example.c
|
运行的时候如果提示找不到ld,可以将interpreter patchelf到你的path/to/your/clang+llvm-19.1.2-cross-hexagon-unknown-linux-musl/x86_64-linux-musl/target/hexagon-unknown-linux-musl/lib/ld-musl-hexagon.so.1
.
或者你将解压出来的lib文件夹下的libc.so通过软链接的方式链接到/lib文件夹下也可以。但是如果是cpp程序,那动态链接库就有点多了,这时候就需要将解压出来的lib文件夹设置为LD路径。这个网上有很多教程。
顺带一提,可以通过修改~/.bashrc
文件的方式使得PATH永久化。export来设置路径是一次性的。
musl调试符号构建
现在官网下载对应版本源码。然后进入root用户,否则编译到后面他才会告诉你路径没有权限访问。
1
| ./configure --prefix=/usr/local/musl CFLAGS='-O2 -v' --enable-debug && make && make install
|
等编译完成。这样在gdb调试musl程序的时候就会有符号了。
波折
算了这部分懒得写了