weiqi7777

riscv-gcc multilib研究

0
阅读(251) 评论(0)

编译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工具链的库文件。

一、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,道理也是一样的。