如何使用 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-gnu
、powerpc64-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)上工作,我让它与下面的命令一起工作。以下是步骤。
- 安装
gcc-mips64-linux-gnuabi64
和 gcc-powerpc64-linux-gnu
。
- 为
CFLAGS
选择正确的参数
-B/usr/mips64-linux-gnuabi64/bin/
表示我们要在该目录中使用链接器 ld
。对 powerpc 做同样的事情。
--target=mips64-linux-gnuabi64
表示我们编译的目标是什么。对 powerpc 做同样的事情。
-I/usr/mips64-linux-gnuabi64/include
包含头文件。对 powerpc 做同样的事情。
- 使用
./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 参数文件来生成命令行构建。
我非常需要用 llvm 为其他架构编译 Coreutils:arm/aarch64/mips/mips32/ppc/ppc32...
因为我安装了所有 gcc-cross 工具,如 mips-linux-gnu
、powerpc64-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
我尝试以同样的方式编译试图设置
的 Coreutilsexport CC=clang
export CXX=clang++
CFLAGS = "--target=mips64-linux-gnuabi64"
./configure --host=mips64-linux-gnuabi64
然而,每次配置或制作时都会出错...
我应该如何设置配置?我可以使用 llvm 为其他架构轻松编译 Coreuntils 吗?
获得正确的交叉编译命令行选项有点棘手。假设您在基于 Debian 的系统(如 Debian 或 Ubuntu)上工作,我让它与下面的命令一起工作。以下是步骤。
- 安装
gcc-mips64-linux-gnuabi64
和gcc-powerpc64-linux-gnu
。 - 为
CFLAGS
选择正确的参数-B/usr/mips64-linux-gnuabi64/bin/
表示我们要在该目录中使用链接器ld
。对 powerpc 做同样的事情。--target=mips64-linux-gnuabi64
表示我们编译的目标是什么。对 powerpc 做同样的事情。-I/usr/mips64-linux-gnuabi64/include
包含头文件。对 powerpc 做同样的事情。
- 使用
./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 参数文件来生成命令行构建。