如何为你的嵌入式Linux板卡选择合适的交叉编译器版本
为什么使用交叉编译器
交叉编译器是在主机上为不同架构/系统生成可执行文件的 GCC,避免在目标板上编译,解决性能、依赖和工具链缺失问题。
本文讲述的嵌入式Linux开发,主机一般是x86-64架构的电脑,嵌入式Linux板卡这里选择的是arm Cortex-Axx架构的的CPU。
1 确定是硬件浮点还是软件浮点
该特性在构建Linux镜像的时候确定,现在可以通过Linux内置的工具查看这项信息。
这里以orangePi PC作为示例;注:[板卡已经安装了基于ubuntu 2004构建的镜像,grep是Linux发行版自带程序]
orangepi@orangepipc:/usr/bin$ file ./grep
./grep: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3,BuildID[sha1]=57c72387cc51f3bcc2859fd7e062f197b0ee5b
92, for GNU/Linux 3.2.0, stripped
通过这些信息可以发现,/lib/ld-linux-armhf.so.3 是以 hf 结尾的,确定是硬件浮点。
2 确定板卡的glib库版本
方法1: ldd的版本,ldd是glibc的一部分,这里可以看到 板卡Linux的glibc的版本是 2.31
orangepi@orangepipc:/lib$ ldd --version
ldd (Ubuntu GLIBC 2.31-0ubuntu9.1) 2.31
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
方法2: 运行 libc.so.6,这个是 glibc的核心库文件
orangepi@orangepipc:/lib$ /lib/arm-linux-gnueabihf/libc.so.6
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.1) stable release version 2.31.Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Compiled by GNU CC version 9.3.0.libc ABIs: UNIQUE ABSOLUTE For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
方法3: getconf工具
orangepi@orangepipc:/lib$ getconf GNU_LIBC_VERSION
glibc 2.31
结论:这里看出板卡的Linux系统自带的板卡glibc版本是 2.31,并且,这个系统镜像是由GCC9.3.0编译器构建的。
3 现在可以确定要找的GCC编译器版本
根据 板卡的Glibc=2.31,找到使用小于或等于该glibc 版本的交叉编译器;
结论: 选择的交叉编译器版本应当小于或等于 gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz

版本注释里说明了相关信息。

解释:交叉编译器名称中,前缀 none与 前缀 linux 的区别:
| 前缀 | 全称示例 | 系统调用封装 | 用途场景 | 典型文件 |
|---|---|---|---|---|
| none | arm-none-eabi-gcc | ❌ 不带 | 裸机、RTOS、BootLoader | libnosys.a |
| linux | arm-none-linux-gnueabihf-gcc | ✅ 带 | Linux 用户空间程序 | libc.so.6 |
结论:
先看板卡的glibc,再看交叉编译器使用的glibc;板卡的glibc版本 ≥ 交叉编译器的glibc版本
找到编译器:gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz
官网下载地址:ARM-GNU-Toolchain

被折叠的 条评论
为什么被折叠?



