如何设置 GCC 以针对 ARM 处理器进行交叉编译?主机将位于 x86_64(AMD64 - Ubuntu 12.04)上,目标将是 ARM(Raspberry Pi 以及 Pandaboard - 将对每个进行单独的编译)?
答案1
安装gcc-arm-linux-gnueabi
和binutils-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 实际上是否在后台运行:
- GDB单步调试一下:https://stackoverflow.com/questions/20590155/how-to-single-step-arm-assembly-in-gdb-on-qemu/51310791#51310791
- 使用以下命令记录执行的 ARM 指令:
qemu-aarch64 -d in_asm,out_asm main.out
https://stackoverflow.com/questions/13005303/how-does-native-android-code-written-for-arm-run-on-x86/44505097#44505097
在 Ubuntu 19.10 中测试。
为了确保严肃应用程序的可靠性,磁盘映像提供商还必须提供兼容的交叉编译器
虽然您可以方便地安装交叉编译器apt
,但我必须警告您,除非图像提供商明确支持,否则这不一定可靠。
如果您错误地选择了交叉编译器,则可能会发生以下情况:
- 动态链接器位于错误路径:https://stackoverflow.com/questions/31929092/trying-to-run-a-cross-compiled-executable-on-target-device-fails-with-no-such-f/49993116#49993116
- 与 glibc 以及您链接的任何其他库存在二进制不兼容问题:https://stackoverflow.com/questions/11107263/how-compatible-are-different-versions-of-glibc
树莓派交叉编译
特别是对于 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
。
这样,就不需要动态链接器,因为二进制文件包含所有内容。