RISC-V架构常见gcc编译选项(-march、-mabi=、-mcmodel、-mlittle-endian、-mbig-endian)

1、-march=RISCV_ARCH

  • 用于告诉编译器目标芯片的架构情况,生成对应的二进制代码
  • 比如:-march=rv32im
    • rv32:告诉编译器生成的代码实在RISC-V架构的32位芯片上运行,就不会使用ld和sd命令,而使用lw和sw
    • im:芯片支持i指令集和m指令集
  • 怎么填写合适的参数
    • -march这个参数不是软件来决定的,是具体的芯片来决定
    • 芯片是什么架构、32位还是64位、支持哪些指令集,这些都是固定的,查芯片手册就知道,或者看厂家提供的demo代码是怎么填的

2、-mabi=RISCV_ABI

数据模型 int long 指针
ilp32/ilp32f/ilp32d 32bit 32bit 32bit
lp64/lp64f/lp64d 32bit 64bit 64bit
浮点数传参规则 需要支持的浮点指令扩展 float参数 double参数
ilp32/lp64 不需要 通过整数寄存器(a0-a1)传递 通过整数寄存器(a0-a3)传递
ilp32f/lp64f 需要支持F扩展 通过浮点寄存器(fa0-fa1)传递 通过整数寄存器(a0-a3)传递
ilp32d/lp64d 需要支持F和D扩展 通过浮点寄存器(fa0-fa1)传递 通过浮点寄存器(fa0-fa1)传递
  • -mabi参数用于指定编译目标的adi,RISC-V定义了两个整型abi和三个浮点abi
    • 两个整型abi
      • ilp32:int、long、pointer都是32位,long long是64位,char是8位,short是16位
      • lp64:long、pointer是64位,int是32位,其他类型和ilp32一样
    • 三个浮点abi
      • ""空字符:在寄存器中不传递浮点参数
      • f:32位浮点寄存器,需要支持F扩展
      • d:64位浮点寄存器,需要支持F和D扩展

3、-march和-mabi的组合

组合 含义
march=rv32imafdc -mabi=ilp32d 可以生成硬件浮点指令,并在寄存器中传递浮点参数。这类似于 ARM 的 GCC 的-mfloat-abi=hard 参数
march=rv32imac -mabi=ilp32 不能生成浮点指令,也不能在寄存器中传递浮点参数。这类似于 ARM 的 GCC 的-mfloat-abi=soft 参数
march=rv32imafdc -mabi=ilp32 可以生成硬件浮点指令,但不会在寄存器中传递浮点参数。这类似于ARM的GCC的-mfloat-abi=softfp参数,通在硬浮动系统上与软浮动二进制文件接口时使用
march=rv32imac -mabi=ilp32d 非法,因为 ABI 要求在寄存器中传递浮点参数,但ISA 没有定义用于传递它们的浮点寄存器

4、-mcmodel

-mcmodel 含义
-mcmodel=medlow 选项用于指示该程序的寻址范围固定只能在-2GB至+2GB的空间内。注意:地址区间没有负数可言,-2GB是指整个64位地址空间最高2GB地址区间
-mcmodel=medany 寻址范围在当前PC的前后2G范围,寻址空间空间是不固定的,比较灵活
  • -mcmodel参数是用于告诉编译器指令的寻址范围,默认是-mcmodel=medlow
  • -mcmodel=medlow:简单理解就是只能寻址[0:4G]。对于32位架构的芯片刚好足够(最大也就是4G空间),但是对于64位架构的芯片则不能寻址全部空间
  • -mcmodel=medany:寻址范围在当前PC的前后2G范围,PC是不断变化的,可以实现把64位架构芯片的全部地址范围都寻址
  • 总结:
    • 32位架构芯片选“-mcmodel=medlow”和“-mcmodel=medany”都可以,但最好选“-mcmodel=medlow”
    • 64位架构芯片则必须选“-mcmodel=medany”,否则可能会因为不能寻址高位地址而出错

5、获取合适“-mabi和-march”组合的简便办法

在这里插入图片描述

  • 在编译工具链中使用-v查看信息,可以知道编译链支持的-march和-mabi组合
  • 这个方法不保证一定正确,正确的前提是维护编译工具链的人要正确填写

6、-mlittle-endian、-mbig-endian

  • -mlittle-endian:生成小端机器码
  • -mbig-endian:生成大端机器码

你可能感兴趣的:(RISC-V架构,risc-v)