SDK 编译工具链
本文档详细介绍 Tina Linux V861 SDK 中各类编译工具链的使用方法,包括工具链路径、编译参数设置以及应用程序、静态库、动态库的编译示例。
概述
V861 架构特点
V861 采用双核异构设计:
| 核心类型 | 架构 | 用途 | 支持模式 |
|---|---|---|---|
| C907 | RISC-V 64-bit | 主核,运行 Tina Linux | RV32I / RV64I / RV64ILP32 |
| E907 | RISC-V 32-bit | 从核,运行 FreeRTOS | RV32IMA |
工具链分类
| 类别 | 位置 | 用途 | 目标 |
|---|---|---|---|
| Linux 用户态 | prebuilt/rootfsbuilt/riscv/ | 编译用户态应用和库 | 应用程序、库 |
| SPL/U-Boot | brandy/brandy-2.0/tools/toolchain/ | 编译 bootloader | SPL、U-Boot |
| RTOS | rtos/lichee/rtos/tools/ | 编译 FreeRTOS 固件 | RTOS 应用 |
SDK 全局 CFLAGS
注意事项
V861 项目 GCC 为 GCC14,新版本编译器对 C/C++ 语法检查更加严格,对于一些较为重要的 warning 默认直接转化为 error 导致无法编译通过,例如:
-Wimplicit-function-declaration-Wint-conversion-Wincompatible-pointer-type
详情请参考:https://gcc.gnu.org/gcc-14/porting_to.html#warnings-as-errors
:::
Linux 用户态编译推荐使用以下全局编译参数:
# SDK 全局 CFLAGS
GLOBAL_CFLAGS="\
-Wno-implicit-function-declaration \
-Wno-int-conversion \
-D_LARGEFILE64_SOURCE \
-D__USE_TIME_BITS64 \
-D_FILE_OFFSET_BITS=64 \
-funwind-tables \
-Wno-unused-but-set-variable \
-Wno-unused-variable \
-Wno-unused-function \
-Wno-unused-label \
-Wno-unused-const-variable \
-Wno-comment \
-Wno-unused-value \
-pipe"
参数说明:
| 参数 | 说明 |
|---|---|
-Wno-implicit-function-declaration | 禁止隐式函数声明警告 |
-Wno-int-conversion | 禁止整数转换警告 |
-D_LARGEFILE64_SOURCE | 启用大文件支持 (64-bit) |
-D__USE_TIME_BITS64 | 使用 64 位时间类型 |
-D_FILE_OFFSET_BITS=64 | 文件偏移量使用 64 位 |
-funwind-tables | 生成异常展开表,便于调试 |
-Wno-unused-* | 禁止各类未使用警告 |
-Wno-comment | 禁止注释警告 |
-pipe | 使用管道替代临时文件,加快编译速度 |
ABI 与架构对应关系
| ABI | 数据模型 | 寄存器宽度 | 适用场景 | 备注 |
|---|---|---|---|---|
ilp32 | 32-bit | x32 | 32位系统调用 | |
ilp32d | 32-bit | x32 + 硬浮点 | RV32 标准用户态 | (SDK默认) |
lp64 | 64-bit | x64 | 64位系统调用 | |
lp64d | 64-bit | x64 + 硬浮点 | RV64 标准用户态 |
Linux 用户态工具链
工具链列表
| 名称 | 架构 | C库 | GCC版本 | 工具链前缀 | CPU 配置 | 备注 |
|---|---|---|---|---|---|---|
| musl32 | RV32 ilp32d | musl | 14.3.0 | riscv32-unknown-linux-musl- | -mcpu=c907fdv-rv32 | (SDK默认) |
| glibc32 | RV32 ilp32d | glibc | 14.3.0 | riscv64-unknown-linux-gnu- | -mcpu=c907fdv-rv32 | |
| musl64 | RV64 lp64d | musl | 14.3.0 | riscv64-unknown-linux-musl- | -mcpu=c907fdv | |
| glibc64 | RV64 lp64d | glibc | 14.3.0 | riscv64-unknown-linux-gnu- | -mcpu=c907fdv |
提示
-
glibc32 模式下,虽然工具链前缀是
riscv64-unknown-linux-gnu-,但通过-mcpu=c907fdv-rv32参数编译出 32 位代码。 -
玄铁 GNU 编译器从 V2.6.0 版本开始,编译器支持
-mcpu=<CPU 型号 >选择与 CPU 相关的所有特性。包括-mabi,-march,-mtune的指定,同时兼容分别指定-march、-mabi和-mtune的方式。推荐使用-mcpu选项。
:::
mcpu 与 mabi,march,mtune 对照表
| mcpu | mabi | march | mtune |
|---|---|---|---|
-mcpu=c907fdv-rv32 | ilp32d | rv32imafdcv_zicbom_zicbop_zicboz_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zcf_zba_zbb_zbc_zbs_zvfbfmin_zvfbfwma_zvfh_sscofpmf_sstc_svinval_svnapot_svpbmt_xtheadc_xtheadvdot | c907 |
-mcpu=c907fdv | lp64d | rv64imafdcv_zicbom_zicbop_zicboz_zicntr_zicond_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zba_zbb_zbc_zbs_zvfbfmin_zvfbfwma_zvfh_sscofpmf_sstc_svinval_svnapot_svpbmt_xtheadc_xtheadvdot | c907 |
musl32 工具链
路径: prebuilt/rootfsbuilt/riscv/Xuantie-900-gcc-linux-6.6.36-musl32-x86_64-V3.3.0
特点: 使用 musl C 库,生成更小的可执行文件,适合嵌入式场景。
环境设置
# 设置工具链路径
TOOLCHAIN=prebuilt/rootfsbuilt/riscv/Xuantie-900-gcc-linux-6.6.36-musl32-x86_64-V3.3.0
export PATH=$TOOLCHAIN/bin:$PATH
CROSS=riscv32-unknown-linux-musl-
编译应用程序
# 创建测试文件
cat > test.c << 'EOF'
#include <stdio.h>
int main() {
printf("Hello V861 musl32!\n");
return 0;
}
EOF
# 编译
${CROSS}gcc -o test test.c \
-mcpu=c907fdv-rv32 \
-Os
# 验证
${CROSS}readelf -h test | grep -E "Class|Machine"
# 输出: Class: ELF32
# Machine: RISC-V
编译静态库
# 创建库源文件
cat > libtest.c << 'EOF'
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
EOF
# 编译为目标文件
${CROSS}gcc -c libtest.c -o libtest.o \
-mcpu=c907fdv-rv32 \
-Os
# 创建静态库
${CROSS}ar rcs libtest.a libtest.o
# 验证
${CROSS}ar -t libtest.a
# 输出: libtest.o
编译动态库
# 编译为动态库
${CROSS}gcc -shared libtest.c -o libtest.so \
-mcpu=c907fdv-rv32 \
-Os
# 验证
${CROSS}readelf -d libtest.so | grep NEEDED
${CROSS}file libtest.so
# 输出: libtest.so: ELF 32-bit LSB shared object, UCB RISC-V, RVC, double-float ABI
静态链接应用
# 静态链接(适用于无动态库的极简环境)
${CROSS}gcc -o test_static test.c \
-mcpu=c907fdv-rv32 \
-static \
-Os
glibc32 工具链
路径: prebuilt/rootfsbuilt/riscv/Xuantie-900-gcc-linux-6.6.36-glibc-x86_64-V3.3.0
特点: 使用 RV64 工具链配合 -march=rv32 参数编译 32 位代码,使用 glibc C 库。
环境设置
TOOLCHAIN=prebuilt/rootfsbuilt/riscv/Xuantie-900-gcc-linux-6.6.36-glibc-x86_64-V3.3.0
export PATH=$TOOLCHAIN/bin:$PATH
CROSS=riscv64-unknown-linux-gnu-