查看: 1438|回复: 0
收起左侧

RISC-V GCC:-specs=nano.specs 的作用

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-1-15 13:53
  • 签到天数: 26 天

    [LV.4]

    发表于 2020-10-1 13:34:27 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 新ちゃん 于 2020-10-1 13:34 编辑

    -specs 的作用

    首先看 gcc 的文档:


    -specs=file
    Process file after the compiler reads in the standard specs file, in order to override the defaults which the gcc driver program uses when determining what switches to pass to cc1, cc1plus, as, ld, etc. More than one -specs=file can be specified on the command line, and they are processed in order, from left to right. See Spec Files, for information about the format of the file.


    原来咱们执行的 gcc 并不是真正的编译器,而是 driver ,即驱动器,gcc 驱动器根据命令行的参数再调用真正的编译器(cc1,cc1plus)、汇编器(as)、链接器(ld)。gcc 驱动器调用 cc1、as、ld 时遵循一定的规则,这个规则就叫做 specs,gcc 有一套自带的 specs ,就是帮助中所说的 standard specs file,standard specs file 可以通过命令打印:

    1. riscv-none-embed-gcc -dumpspecs
    复制代码

    如果命令行中没有指定 -specs=file 参数,那么 gcc 就使用自带的 specs,如果指定了 -specs=file 参数,那么在处理完自带的 specs 后,继续处理参数给出的 specs 文件,而且可以通过多个 -specs=file 参数指定多个 specs 文件,gcc 会按出现的次序依次处理。后面的 specs 文件可以覆盖、修改、删除前面的 specs 中的规则。这里的规则是指 gcc 以什么样的参数调用 cc1、as、ld 。

    cc1 是真正的 C 编译器,cc1plus 是 C++ 编译器。


    nona.specs 的作用

    可以翻看一下 nano.specs 的文件内容,文件位于 <gcc-install-dir>/riscv-none-embed/lib/ 目录下:

    1. %rename link                nano_link
    2. %rename link_gcc_c_sequence                nano_link_gcc_c_sequence
    3. %rename cpp                nano_cpp

    4. *cpp:
    5. -isystem =/include/newlib-nano %(nano_cpp)

    6. *nano_libc:
    7. -lc_nano

    8. *nano_libgloss:
    9. %{specs=nosys.specs:-lnosys}

    10. *link_gcc_c_sequence:
    11. %(nano_link_gcc_c_sequence) --start-group %G %(nano_libc) %(nano_libgloss) --end-group

    12. *link:
    13. %(nano_link) %:replace-outfile(-lc -lc_nano) %:replace-outfile(-lg -lg_nano)  %:replace-outfile(-lrdimon -lrdimon_nano) %:replace-outfile(-lstdc++ -lstdc++_nano) %:replace-outfile(-lsupc++ -lsupc++_nano)

    14. *lib:
    15. %{!shared:%{g*:-lg_nano} %{!p:%{!pg:-lc_nano}}%{p:-lc_p}%{pg:-lc_p}}
    复制代码

    specs 文件的格式请参考 Spec Files


    nona.specs 将 -lc 替换成 -lc_nano,即:使有精简版的C库替代标准C库。精简的C库有些特性是被排除掉的,比如 printf* 系列函数不支持浮点数的格式化,因为做了精简,因此最终生成的程序映像要比使用标准C库要小一些。如果没有用到这部分特性,就可以通过 -specs=nano.specs 节约有限的代码空间,如果使用了该参数后发现有些C库函数行为不符合预期,比如 sprintf 没有格式化浮点数,那么将这个参数去掉。








    上一篇:RISC-V 整数寄存器(x0~x31)与浮点寄存器(f0~f31)数据交换
    下一篇:地位堪比光刻机!国产EDA/IP有哪些“排头兵”?
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-6 07:54 , Processed in 0.338445 second(s), 46 queries .

    快速回复 返回顶部 返回列表