如何使用 clang/LLVM 交叉编译 Coreutils 或其他 GNU 项目?

How to cross-compile Coreutils or other GNU projects with clang/LLVM?

我非常需要用 llvm 为其他架构编译 Coreutils:arm/aarch64/mips/mips32/ppc/ppc32...

因为我安装了所有 gcc-cross 工具,如 mips-linux-gnupowerpc64-linux-gnu,如果我有一个像这样的简单 C 程序 test.c

#include<stdio.h>
int main(){
    printf("hello!");
    return 0;
}

我可以把它编译成arch,即

clang --target=mips64-linux-gnuabi64 test.c -o test-mips64
➜  tests file test-mips64 
test-mips64: ELF 64-bit MSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, BuildID[sha1]=7b33d55a0d08e6cd18d966341590dc351e346a78, for GNU/Linux 3.2.0, not stripped

我尝试以同样的方式编译试图设置

的 Coreutils
export CC=clang
export CXX=clang++
CFLAGS = "--target=mips64-linux-gnuabi64"
./configure --host=mips64-linux-gnuabi64

然而,每次配置或制作时都会出错...

我应该如何设置配置?我可以使用 llvm 为其他架构轻松编译 Coreuntils 吗?

获得正确的交叉编译命令行选项有点棘手。假设您在基于 Debian 的系统(如 Debian 或 Ubuntu)上工作,我让它与下面的命令一起工作。以下是步骤。

  1. 安装 gcc-mips64-linux-gnuabi64gcc-powerpc64-linux-gnu
  2. CFLAGS选择正确的参数
    • -B/usr/mips64-linux-gnuabi64/bin/ 表示我们要在该目录中使用链接器 ld。对 powerpc 做同样的事情。
    • --target=mips64-linux-gnuabi64 表示我们编译的目标是什么。对 powerpc 做同样的事情。
    • -I/usr/mips64-linux-gnuabi64/include 包含头文件。对 powerpc 做同样的事情。
  3. 使用 ./configure --host=mips64-linux-gnuabi 为 mips64 配置,./configure --host=powerpc64-linux-gnueabi 为 powerpc64 配置。

以下是为 mips64 编译的命令:

make clean
CFLAGS="-B/usr/mips64-linux-gnuabi64/bin/ --target=mips64-linux-gnuabi64 -I/usr/mips64-linux-gnuabi64/include" \
    ./configure --host=mips64-linux-gnuabi
make

以及为 powerpc64 编译的命令:

make clean
CFLAGS="-B/usr/powerpc64-linux-gnu/bin/ --target=powerpc64-linux-gnueabi -I/usr/powerpc64-linux-gnu/include" \
    ./configure --host=powerpc64-linux-gnueabi
make

这里是 file ./src/ls 的输出,以证明它是一个 powerpc64 可执行文件:

$ file ./src/ls
./src/ls: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=97fe33981ca0112160f44a6fb678d6dc1b462114, not stripped

下面是一个 Dockerfile,可用于为 mips64 和 powerpc64 重复交叉编译 coreutils。

# Cross-compile GNU coreutils for mips64 and powerpc64 using clang.
# With help from https://medium.com/@wolfv/cross-compiling-arm-on-travis-using-clang-and-qemu-2b9702d7c6f3

FROM debian:buster

# Install compile-time dependencies.
RUN apt-get update \
    && apt-get install --yes \
        clang \
        curl \
        gcc-mips64-linux-gnuabi64 \
        gcc-powerpc64-linux-gnu \
        make \
        perl \
    && rm -rf /var/lib/apt/lists/*

# Download source code for release.
WORKDIR /tmp/coreutils
RUN curl -fsSL https://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz \
    | tar xJ --strip-components 1

# Compile and install for mips64.
RUN CFLAGS="-B/usr/mips64-linux-gnuabi64/bin/ --target=mips64-linux-gnuabi64 -I/usr/mips64-linux-gnuabi64/include" \
        ./configure --host=mips64-linux-gnuabi --prefix=/opt/coreutils-mips \
    && make \
    && make install

# Compile and install for powerpc64.
RUN make clean \
    && CFLAGS="-B/usr/powerpc64-linux-gnu/bin/ --target=powerpc64-linux-gnueabi -I/usr/powerpc64-linux-gnu/include" \
        ./configure --host=powerpc64-linux-gnueabi --prefix=/opt/coreutils-powerpc64 \
    && make \
    && make install

# Keep only the compiled programs from the previous stage.
FROM debian:buster
COPY --from=0 /opt /opt

我目前正在 Python 中开发一个简单的构建工具,它可能会对您有所帮助。 不幸的是,目前仍然缺少 clang 实现,但可以与 GCC 和 MSVC 一起正常工作。 基本上混合 Json 参数文件来生成命令行构建。

CppMagic