编译riscv工具链的时候,在configure阶段,有- -enable_multilib选项,该选项会控制,生成多个仿真库。
通过 ./configure -h ,可以查看 - -enable_multilib 选项的功能。
- -enable-multilib build both RV32 and RV64 runtime libraries [- -disable-multilib] |
下面,就要探究以下,这个选项的作用。
使用如下命令,编译gcc工具链。
mkdir build ../configure --prefix=/home/lujun/tools/riscv-gcc4 --with_target=rv32gc --with-api=ilp32d --enable_multilib make
编译完毕之后,在 /home/lujun/tools/riscv-gcc4 目录下,就是生成好的gcc工具链。
在bin目录下,有gcc工具:
在 riscv32-unknown-elf/lib 目录下,放的是gcc工具链的库文件。
Contents
一、configure不配置--enable-multilib
如果在configure阶段,没有- -enable-multilib选项,那么生成的gcc工具链中,riscv32-unknown-elf/lib 目录下,就只有如下的一些文件。
二、configure配置--enable-multilib
如果在configure阶段,带有- -enable-multilib选项,那么生成的gcc工具链中,riscv32-unknown-elf/lib 目录下,就会有如下的一些文件。
会多一些目录,这些目录,是已架构进行组织的。比如rv32iac,表示支持的riscv的架构是rv32iac,如果编译的时候,指定-march=rv32iac,那么链接库的时候,就会使用rv32iac目录下的库。
在每个架构文件下,还有一个目录,表示该架构支持的mabi。比如在rv32iac目录下,就有ilp32目录,表示编译的时候,指定-march=rv32iac时,此时支持的-mabi就是ilp32。
默认组合的情况如下表所示:
march |
mabi |
目录 |
rv32i |
ilp32 |
rv32i/ilp32 |
rv32iac |
ilp32 |
rv32iac/ilp32 |
rv32im |
ilp32 |
rv32im/ilp32 |
rv32imac |
ilp32 |
rv32imac/ilp32 |
rv32imafc |
ilp32 |
rv32imafc/ilp32f |
rv64imac |
lp64 |
rv64imac/lp64 |
rv64imafdc |
lp64d |
rv64imafdc/lp64d |
下面,进行简单测试:
对于编写的一个hello_world.c程序,使用不同的选项编译,查看链接的库。
1、不带march选项
使用如下命令编译:
riscv32-unknown-elf-gcc hello.c -Xlinker -verbose
打印信息如下:
attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/libgloss.so failed attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/libgloss.a failed attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.so failed attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a succeeded /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_close.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_exit.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_fstat.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_isatty.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_lseek.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_read.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_sbrk.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_write.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a)sys_conv_stat.o /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libc.a (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libc.a)lib_a-errno.o /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/libgloss.a |
从打印信息可以看出,首先是链接 lib/gcc/riscv32-unknown-elf/8.3.0 下面的库,如果找不到库文件,就链接 riscv32-unknown-elf/lib 下面的库。
因为没有指定-march,所以此时编译时, -march=rv32gc, -mabi=ilp32d。这个是由configure阶段,配置的。
2、-march=rv32imac
使用如下命令进行编译:
riscv-unknown-elf-gcc -march=rv32imac -mabi=ilp32 hello.c -Xlinker -verbose
打印信息如下:
attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/rv32imac/ilp32/libgloss.so failed attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/rv32imac/ilp32/libgloss.a failed attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.so failed attempt to open /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a succeeded /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_close.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_exit.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_fstat.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_isatty.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_lseek.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_read.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_sbrk.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_write.o (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a)sys_conv_stat.o /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libc.a (/home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libc.a)lib_a-errno.o /home/lujun/tools/riscv-gcc3/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/rv32imac/ilp32/libgloss.a |
从log可以看出,首先是链接 lib/gcc/riscv32-unknown-elf/8.3.0/rv32imac/ilp32 下面的库,如果找不到库文件,就链接 riscv32-unknown-elf/lib/rv32imac/ilp32 下面的库。
所以-march=rv32imac,影响了链接时候,所使用的库。此时-mabi=ilp32。
如果使用如下的命令:
riscv32-unknown-elf-gcc -march=rv32imac -mabi=ilp32d hello.c -Xlinker -verbose
那么编译的时候就会报错:
cc1: error: requested ABI requires -march to subsume the 'D' extension |
表示march和mabi选项不匹配。
至于其他的march,道理也是一样的。