如何进行 ARM 交叉编译?

如何进行 ARM 交叉编译?

如何设置 GCC 以针对 ARM 处理器进行交叉编译?主机将位于 x86_64(AMD64 - Ubuntu 12.04)上,目标将是 ARM(Raspberry Pi 以及 Pandaboard - 将对每个进行单独的编译)?

答案1

安装gcc-arm-linux-gnueabibinutils-arm-linux-gnueabi包,然后只需使用arm-linux-gnueabi-gcc而不是gcc进行编译。

您需要注意目标系统上的 Linux 和 binutils 版本。最新的版本是 hardfloat,在这种情况下,您需要执行以下操作:

sudo apt-get install gcc-arm-linux-gnueabihf

这将引入完整的交叉编译环境,包括 binutils。

为了在构建过程中使用此 GCC,请写入:

CC=arm-linux-gnueabihf-gcc make

答案2

64 位 ARM

对于 64 位 ARM,工具链前缀为aarch64,用法为:

sudo apt install gcc-9-aarch64-linux-gnu
aarch64-linux-gnu-gcc -o main.out main.c

你可以使用 QEMU 在这个 C hello world 上尝试一下:

主程序

#include <stdio.h>

int main(void) {
    puts("hello");
}

进而:

sudo apt install qemu-user
qemu-aarch64 main.out

将输出:

hello

然后,您可以做一些有趣的事情来快速查看 ARM 实际上是否在后台运行:

在 Ubuntu 19.10 中测试。

为了确保严肃应用程序的可靠性,磁盘映像提供商还必须提供兼容的交叉编译器

虽然您可以方便地安装交叉编译器apt,但我必须警告您,除非图像提供商明确支持,否则这不一定可靠。

如果您错误地选择了交叉编译器,则可能会发生以下情况:

树莓派交叉编译

特别是对于 RPI,提供的交叉编译器可在以下位置获得:https://github.com/raspberrypi/tools用法如下:https://raspberrypi.stackexchange.com/questions/64273/installing-raspberry-pi-cross-compiler/83215#83215

git clone https://github.com/raspberrypi/tools
export PATH="$(pwd)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:${PATH}"
printf '#include <stdio.h>\nint main() { puts("hello world"); }\n' > hello_world.c
printf '#include <iostream>\nint main() { std::cout << "hello world" << std::endl; }\n' > hello_world.cpp
arm-linux-gnueabihf-gcc -std=c99 -o hello_world_c hello_world.c
arm-linux-gnueabihf-g++ -std=c++11 -o hello_world_cpp hello_world.cpp

Ubuntu 交叉编译

如果您想为 Ubuntu arm64 进行交叉编译,我一直无法找到关于哪些交叉编译器支持哪个发行版的明确参考:Ubuntu 服务器替代架构(如 ARM)官方支持的交叉编译器有哪些?

构建根

我最喜欢的替代方法是使用 Buildroot 构建自己的图像:https://stackoverflow.com/questions/47557262/how-to-download-the-torvalds-linux-kernel-master-recompile-it-and-boot-it-wi/49349237#49349237

这将从源代码构建一切,包括工具链和图像,并确保一切兼容。

答案3

据我所知,如果您只是在您的电脑上进行实验,使用可能没问题aarch64-linux-gnu-gcc program.c -static

这样,就不需要动态链接器,因为二进制文件包含所有内容。

相关内容