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

Risc-v 各种版本gcc工具链编译与安装

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2020-8-24 16:05:59 | 显示全部楼层 |阅读模式

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

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

    x
    本帖最后由 皋陶 于 2020-8-25 17:58 编辑

    要学习riscv架构,首先第一步,要搞定riscv的gcc交叉编译器。下面就对riscv的gcc交叉编译器,进行详细的介绍。


    一、riscv gcc工具下载

    Riscv的gcc交叉编译器,以开源的方式托管在github上。链接如下:

    https://github.com/riscv/riscv-gnu-toolchain


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(1)


    该仓库,里面包含了一些子仓库。


    使用以下这个命令,将所有仓库,都clone下来。


    1. git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
    复制代码


    以下是各个仓库的github地址:


    riscv-gcc

    https://github.com/riscv/riscv-gcc

    riscv-glibc

    https://github.com/riscv/riscv-glibc

    riscv-newlib

    https://github.com/riscv/riscv-newlib

    riscv-dejagnu

    https://github.com/riscv/riscv-dejagnu

    riscv-gdb

    https://github.com/riscv/riscv-binutils-gdb.git

    riscv-binutils

    https://github.com/riscv/riscv-binutils-gdb.git

    riscv-qemu

    https://github.com/riscv/riscv-qemu.git


    二、编译riscv gcc

    下载完毕后,就要开始编译。首先在riscv-gnu-toolchain根目录下,创建build目录。用于编译riscv gcc。


    riscv gcc可以编译成以下几个版本


    • riscv32-unknown-elf-gcc

    • riscv64-unknown-elf-gcc

    • riscv32-unknown-linux-gnu-gcc

    • riscv64-unknown-linux-gnu-gcc

    • riscv64-multilib-elf-gcc

    • riscv64-liunx-multilib-gcc



    以下编译,是基于 riscv架构支持 imc三种指令集,来进行编译的。如果想要支持其他的指令集,只需要修改 --with-arch选项。


    1、riscv32-unknown-elf-gcc

    该工具,针对于riscv32架构的编译器,使用的C运行库为newlib。


    执行以下命令:

    1. ../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx
    2. make
    复制代码


    --mabi可以选择如下:

    • ilp32

    • ilp32f

    • ilp32d



    编译完成后,在/opt/riscv/bin目录下,有riscv32-unknown-elf-gcc的所有工具。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(2)


    通过 riscv32-unknown-elf-gcc -v命令,可以得到该工具链的配置信息。


    1. Using built-in specs.
    2. COLLECT_GCC=./riscv32-unknown-elf-gcc
    3. COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv32-unknown-elf/8.2.0/lto-wrapper
    4. Target: riscv32-unknown-elf
    5. Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-elf --prefix=/opt/riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv/riscv32-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
    6. Thread model: single
    7. gcc version 8.2.0 (GCC)
    复制代码


    可以看出:

    1. --target=riscv32-unknown-elf: 指定工具为riscv32-unknow-elf
    2. --prefix=/opt/riscv32:  指定工具生成的目录
    3. --enable-languages=c,c++:  支持c,c++语言
    4. --with-newlib:  c运行库使用newlib
    5. --with-abi=ilp32: 工具链支持的abi方式是ilp64
    6. --with-arch=rv32imc:  工具链支持的riscv架构是 rv64imc
    复制代码


    在build目录下,有如下的文件夹和文件生成。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(3)


    其中有newlib和newlib-nano,就表示c运行库,就是用的newlib以及newlib-nano。


    2、riscv64-unknown-elf-gcc

    该工具,针对于riscv64架构的编译器,使用的C运行库为newlib。


    执行以下命令:


    1. ../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxx
    2. make
    复制代码


    --with-abi可以选择如下:

    • lp64

    • lp64f

    • lp64d



    编译完成后,在/opt/riscv64/bin目录下,有riscv64-unknown-elf-gcc的所有工具。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(4)


    使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。


    1. Using built-in specs.
    2. COLLECT_GCC=./riscv64-unknown-elf-gcc
    3. COLLECT_LTO_WRAPPER=/opt/riscv64/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
    4. Target: riscv64-unknown-elf
    5. Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-elf --prefix=/opt/riscv64 --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv64/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64 --with-arch=rv64imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
    6. Thread model: single
    7. gcc version 8.2.0 (GCC)
    复制代码


    可以看出:


    1. --target=riscv64-unknown-elf: 指定工具为riscv64-unknow-elf
    2. --prefix=/opt/riscv64:  指定工具生成的目录
    3. --enable-languages=c,c++:  支持c,c++语言
    4. --with-newlib:  c运行库使用newlib
    5. --with-abi=lp64: 工具链支持的abi方式是lp64
    6. --with-arch=rv64imc:  工具链支持的riscv架构是 rv64imc
    复制代码


    在build目录下,有如下的文件夹和文件生成。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(5)


    其中有newlib和newlib-nano,就表示c运行库,就是用的newlib以及newlib-nano。


    3、riscv32-unknown-linux-gnu-gcc

    该工具,针对于riscv32架构的编译器,使用的C运行库为linux中的标准glibc。


    执行以下命令:


    1. ../configure --prefix=/opt/riscv32-linux --with-arch=rv32imc --with-abi=xxx --enable-linux
    2. make linux
    复制代码


    --with-abi可以选择如下:


    • lp64

    • lp64f

    • lp64d



    编译完成后,在/opt/riscv32-linux/bin目录下,有riscv32-unknown-linux-gnu-gcc的所有工具。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(6)


    使用 riscv32-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。


    1. Using built-in specs.
    2. COLLECT_GCC=./riscv32-unknown-linux-gnu-gcc
    3. COLLECT_LTO_WRAPPER=/opt/riscv-linux/libexec/gcc/riscv32-unknown-linux-gnu/8.2.0/lto-wrapper
    4. Target: riscv32-unknown-linux-gnu
    5. Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-linux-gnu --prefix=/opt/riscv-linux --with-sysroot=/opt/riscv-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
    6. Thread model: single
    7. gcc version 8.2.0 (GCC)
    复制代码


    可以看出:


    1. --target=riscv32-unknown-linux-gnu: 指定工具为riscv32-unknow-linux-gnu
    2. --prefix=/opt/riscv-linux:  指定工具生成的目录
    3. --enable-languages=c,c++:  支持c,c++语言
    4. --with-abi=ilp32: 工具链支持的abi方式是ilp32
    5. --with-arch=rv32imc:  工具链支持的riscv架构是 rv32imc
    复制代码


    虽然有--with-newlib配置选项,但是编译却不会有newlib编译,而有glibc编译。因为使用的是make linux进行编译。也可以在configure阶段,加上--enable-linux选项。


    在build目录下,有如下文件以及文件夹:


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(7)


    可以看出,用的c运行库是glibc。


    4、riscv64-unknown-linux-gnu-gcc

    该工具,针对于riscv64架构的编译器,使用的C运行库为linux中的标准glibc。


    执行以下命令:


    1. ../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
    2. make linux
    复制代码


    --with-abi可以选择如下:


    • lp64

    • lp64f

    • lp64d



    编译完成后,在/opt/riscv64-linux/bin目录下,有riscv64-unknown-linux-gnu-gcc的所有工具。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(8)


    使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。


    1. Using built-in specs.
    2. COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
    3. COLLECT_LTO_WRAPPER=/opt/riscv64-linux/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
    4. Target: riscv64-unknown-linux-gnu
    5. Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv64-linux --with-sysroot=/opt/riscv64-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
    6. Thread model: single
    7. gcc version 8.2.0 (GCC)
    复制代码


    可以看出:


    1. --target=riscv64-unknown-linux-gnu: 指定工具为riscv64-unknow-linux-gnu
    2. --prefix=/opt/riscv64:  指定工具生成的目录
    3. --enable-languages=c,c++:  支持c,c++语言
    4. --with-abi=lp64d: 工具链支持的abi方式是lp64d
    5. --with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
    复制代码


    虽然有--with-newlib配置选项,但是编译却不会有newlib编译,而是有glibc编译。因为使用的是make linux进行编译。也可以在configure阶段,加上--enable-linux选项。


    在build目录下,有如下文件以及文件夹:


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(9)


    可以看出,用的c运行库是glibc。


    5、riscv64-linux-multilib

    在编译riscv工具链的时候,可以编译multilib版本的gcc,这样这个工具,可以同时支持32位和64位。


    执行以下命令:


    1. ../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv64-linux-multilib
    2. make linux
    复制代码

    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(10)


    编译完成后,在/opt/riscv64-linux/bin目录下,有riscv64-linux-multilib -gcc的所有工具。


    虽然有通过--target指定,但是生成的工具链名字还是riscv64-unknow-linu-gnu-gcc。


    使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。


    1. Using built-in specs.
    2. COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
    3. COLLECT_LTO_WRAPPER=/opt/riscv-multilib/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
    4. Target: riscv64-unknown-linux-gnu
    5. Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target= riscv64-linux-multilib --prefix=/opt/riscv-linux-multilib --with-sysroot=/opt/riscv-linux-multilib/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
    6. Thread model: single
    复制代码


    可以看出:


    1. --target= riscv64-linux-multilib: 指定工具为riscv64-linux-multilib
    2. --prefix=/opt/riscv-linux-multilib:  指定工具生成的目录
    3. --enable-languages=c,c++:  支持c,c++语言
    4. --with-abi=lp64d: 工具链支持的abi方式是lp64d
    5. --with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
    6. --enabl-multilib: 启动 multilib
    复制代码


    对于riscv64-linux-multilib-gcc编译器,可以通过以下选项,来决定生成的程序是32位版本还是64位版本:


    • -march=rv32: 32位版本
    • -march=rv64: 64位版本



    6、riscv64-multilib-elf-gcc

    在裸机编译riscv工具链的时候,可以编译multilib版本的gcc,这样这个工具,可以同时支持32位和64位。


    执行以下命令:


    1. ../configure --prefix=/opt/riscv64-multilib-elf --enable-multilib --target=riscv64-multilib-elf
    2. make
    复制代码


    编译完成后,在/opt/ riscv64-multilib-elf /bin目录下,有riscv64-multilib-elf-gcc的所有工具。


    国内芯片技术交流-Risc-v 各种版本gcc工具链编译与安装risc-v单片机中文社区(11)


    虽然有使用--target指定,但是生成的编译器还是riscv64-unknown-elf-gcc。


    使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。


    1. Using built-in specs.
    2. COLLECT_GCC=./riscv64-unknown-elf-gcc
    3. COLLECT_LTO_WRAPPER=/opt/riscv64-multilib-elf/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
    4. Target: riscv64-unknown-elf
    5. Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-multilib-elf --prefix=/opt/riscv64-multilib-elf --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-system-zlib --with-newlib --with-sysroot=/opt/riscv64-multilib-elf/riscv64-unknown-elf --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
    6. Thread model: single
    7. gcc version 8.2.0 (GCC)
    复制代码


    可以看出:


    1. --target=riscv64-multilib-elf: 指定工具为riscv64-multilib-elf
    2. --prefix=/opt/riscv64-multilib-elf:  指定工具生成的目录
    3. --enable-languages=c,c++:  支持c,c++语言
    4. --with-abi=lp64d: 工具链支持的abi方式是lp64d
    5. --with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
    6. --enable-multilib:  启用multilib
    复制代码


    对于riscv64-multilib-elf-gcc编译器,可以通过以下选项,来决定生成的程序是32位版本还是64位版本:


    • -march=rv32: 32位版本
    • -march=rv64: 64位版本



    三、riscv-none-embed-gcc

    专门为嵌入式使用的gcc交叉编译工具链。官方网站:


    https://gnu-mcu-eclipse.github.io/toolchain/riscv/


    可以直接下载linux的二进制执行程序,以及windows的安装包。这个一般要搭配GNU MCU eclipse工具一起使用。


    因为这个工具,直接提供执行程序,因此就不介绍了。


    四、总结

    riscv的gcc编译器,分为2大类:


    • 裸机: unknown-elf,none-embed

    • linux: linux



    除了none-embed编译器,对于每一类,如果禁用multilib,那么又分为32位版本和64位版本。如果使能multilib,那么就只有一个版本,但是这个版本工具,可以同时支持32位和64位。

    本篇完,感谢关注:RISC-V单片机中文网




    上一篇:RISC-V qemu模拟器编译的问题
    下一篇:蜂鸟E200 RISC-V CPU:(一)取指
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-4-20 16:37 , Processed in 0.954717 second(s), 48 queries .

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