下面是 RISC‑V 平台上“最常用、最容易踩坑”的 GCC 选项速查。按类别整理,并给出常见组合示例与自检方法。
常用 RISC‑V 专属/相关选项
| 选项 | 作用 | 常见取值/示例 | 备注 |
|---|---|---|---|
| -march= | 选择 ISA 扩展 | rv64gc、rv64imac、rv32imac、rv64gcv_zvl128b | g=imafd+zicsr+zifencei;c=压缩;a=原子;v=向量;zba/zbb/zbs=位操作;zk*=加密;按硬件/库匹配 |
| -mabi= | 选择 ABI | lp64、lp64f、lp64d、ilp32、ilp32f、ilp32d、ilp32e | 与库/RTOS ABI 必须一致;Linux 通常 lp64d;RV32E 用 ilp32e |
| -mcpu= | 一次性指定 CPU(派生 march/mtune) | sifive-u74、thead-c906、generic | 比单独写 -march/-mtune 更省心(需工具链支持该名) |
| -mtune= | 仅调度/优化目标 | rocket、sifive-7-series、thead-c906、size | 不改变兼容性,仅影响性能/体积 |
| -mcmodel= | 代码/数据寻址模型(RV64) | medlow、medany | medlow:低 2GB;medany:位置无关/高地址更安全,Linux 常用 |
| -mrelax/-mno-relax | 启/停链接放宽(relaxation) | 默认多为开启 | 需汇编器和链接器同时开启;调试或时间敏感固件可关 |
| -mstrict-align / -mno-strict-align | 是否允许非对齐访存 | 默认为严格对齐 | 硬件支持且追求性能可用 -mno-strict-align |
| -msmall-data-limit= | small data 阈值(使用 gp 相对寻址) | 0、8、16、32 | 0 关闭;需运行时正确设置 gp;可减小指令体积 |
| -msave-restore | 用库函数保存/恢复寄存器 | 开/关 | 体积更小(尤其 -Os),但每函数多两次调用;需 libgcc 支持 |
| -fPIC/-fpic | 生成位置无关代码(共享库/DSO) | Linux 常用 -fPIC | 裸机一般不用 |
| -fpie 和 -pie | 位置无关可执行文件 | -fpie 构建,-pie 链接 | Linux 可执行强化 |
| -ffreestanding | 自给环境(无 hosted 依赖) | 裸机/RTOS 必备 | 常配合 -nostdlib -nostartfiles |
| -nostdlib/-nostartfiles | 不用系统启动文件/标准库 | 裸机/RTOS | 记得手动链接 -lgcc/-lc(若用 newlib) |
| -ffunction-sections -fdata-sections | 每函数/数据独立节 | 常与链接裁剪配合 | |
| -Wl,--gc-sections | 链接时裁剪未引用节 | 节省体积 | 与上两项配合 |
| -O2/-O3/-Os/-Oz | 优化级别 | 通用 | -Os/-Oz 更小;-O3 更快 |
| -g/-gdwarf-4 | 调试信息 | 通用 | |
| -fno-builtin | 禁止内建函数折叠 | 裸机常用 | 避免隐式依赖 libc |
| -fno-common | 统一 BSS 放置 | 裸机常用 | 避免多重定义隐患 |
| -flto | 链接时优化 | 可选 | 需 ld/工具链配合 |
| -fno-plt | 直连调用,减少 PLT 间接 | Linux 可选 | 搭配 -Wl,-z,now/-z,relro |
关于浮点与向量扩展
- 浮点:是否生成浮点指令由 -march 是否包含 F/D/Zfh 决定;参数传递 ABI 则由 -mabi 的 f/d 决定。两者需与库一致,不能混用。
- 向量(V):使用 -march=…v(可加 zvl128b/zvl256b 指定最小向量寄存器位宽)。想要自动向量化可配 -O3 -ftree-vectorize;也可用 RVV intrinsic。
典型组合示例
- RV64 Linux(硬浮点通用)
- -march=rv64gc -mabi=lp64d -mcmodel=medany -O2 -g -fPIC -fno-plt
- 链接:-Wl,-z,relro -Wl,-z,now -Wl,--as-needed
- RV64 裸机/RTOS(软浮点,省心兼容)
- -march=rv64imac -mabi=lp64 -mcmodel=medany -Os -g -ffreestanding -fno-builtin -ffunction-sections -fdata-sections
- 链接:-nostartfiles -nostdlib -Wl,--gc-sections -T linker.ld -Wl,-Map=out.map -Wl,--start-group -lc -lgcc -Wl,--end-group
- RV32 MCU/裸机
- -march=rv32imac -mabi=ilp32 -Os -g -msave-restore -ffreestanding -fno-builtin -ffunction-sections -fdata-sections
- RV64 向量加速(硬件支持 V)
- -march=rv64gcv_zvl128b -mabi=lp64d -O3 -ftree-vectorize
- RV32E(16 寄存器小核)
- -march=rv32e -mabi=ilp32e -Os -g
易混点/踩坑
- ABI 与库必须一致:lp64d 的对象不能和 lp64 的库混链,反之亦然。
- 想“软浮点”:不仅要 -mabi=lp64/ilp32,还要把 -march 里的 F/D 移除。
- 链接放宽(relax)要编译和链接两边一致;遇到断点/时序敏感代码,可临时关掉 -mrelax 与 --relax。
- 使用 small data 时记得在启动代码里正确设置 gp,否则会崩。
自检与排错小工具
- 看工具链支持的 multilib:riscv64-unknown-elf-gcc -print-multi-lib
- 查默认 ISA/ABI:riscv64-unknown-elf-gcc -Q --help=target | grep -E 'mabi|march|mcmodel|mtune'
- 验证产物要求的扩展:readelf -A a.elf(看 Tag_RISCV_arch)
- 查是否生成了浮点/向量指令:objdump -d a.elf | grep -E 'f(add|mul|div|sqrt).|v[0-9]'
772

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



