首页 > 解决方案 > 如何使用 clang/LLVM 交叉编译 Coreutils 或其他 GNU 项目?

问题描述

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

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

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

我可以将它编译到拱门,即

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 吗?

标签: clangcross-compilinggnu-coreutils

解决方案


让命令行选项正确用于交叉编译有点棘手。假设您正在使用基于 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

推荐阅读