https://zhuanlan.zhihu.com/p/429399630
Linux ubuntu 5.11.0-1021-generic #22-Ubuntu SMP Tue Sep 28 15:19:16 UTC 2021 riscv64 riscv64 riscv64 GNU/Linux
Linux version 5.11.0-1021-generic (buildd@riscv64-qemu-lcy01-078) (gcc (Ubuntu 10.3.0-1ubuntu1) 10.3.0, GNU ld (GNU Binutils for Ubuntu) 2.36.1) #22-Ubuntu SMP Tue Sep 28 15:19:16 UTC 2021编译SPEC CPU 2006
由于目前SPEC CPU 2006源码中已经编译好toolset不支持RISC-V, 所以需要自己编译
安装gcc, g++, gfortran
$ sudo apt-get install build-essential
$ sudo apt-get install gfortran
安装完成后,检查安装是否正确
$ gcc -v
$ g++ -v
$ gfortran -v
将spec cpu 2006源码复制出来
$ sudo mount cpu2006-1.2.iso /mnt
$ mkdir cpu2006
$ cp -r /mnt/* cpu2006/
由于toolset源码中的config.guess,config.sub文件比较旧,需要替换为比较新的文件,新文件的地址如下:
http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
找到源码中所有config.guess,config.sub文件进行替换
$ find /home/ubuntu/cpu2006/tools/src -name config.guess
$ find /home/ubuntu/cpu2006/tools/src -name config.sub
在toolset源码路径下执行./buildtools编译toolset
ubuntu@ubuntu:~/cpu2006/tools/src$ ./buildtools
编译的过程中会遇到错误,以下是我遇到的错误和相应的解决方法,供参考:
1)出现__alloca'和
__stat'未定义的错误
解决方法:找到/home/ubuntu/cpu2006/tools/src/make-3.82/glob/glob.c文件,注释掉第211和第232这两行
2)出现重复定义的错误
解决方法:执行export CFLAGS="$CFLAGS -fcommon"(从最新的GCC 10版本以后开始,“-fno-common”将会默认开启,如果遇到编译不过的程序,请先改为“-fcommon”,再尝试编译试试看)
3) 'gets' undeclared here错误
解决方法:
修改文件/home/ubuntu/cpu2006/tools/src/specsum/gnulib/stdio.in.h,将第161-162行注释掉
修改/home/ubuntu/cpu2006/tools/src/tar-1.25/gnu/stdio.in.h, 将第146-147行注释掉
4)大量出现pow、floor、fmod、sin等函数未定义的错误
解决方法:执行执行export PERLFLAGS="-A libs=-lm -A libs=-ldl -A libs=-lc -A ldflags=-lm -A cflags=-lm -A ccflags=-lm -Dlibpth=/usr/lib/riscv64-linux-gnu -A ccflags=-fwrapv"
5)出现error building Perl错误
解决方法:修改/home/ubuntu/cpu2006/tools/src/perl-5.12.3/Configure文件,将其中所有的
case "$gccversion" in
1*)
修改为
case "$gccversion" in
1.*)
即
改为
6)error running TimeDate-1.20 test suite
这是perl的Time::Local::timegm函数的参数错了
解决方法:/home/ubuntu/cpu2006/tools/src/TimeDate-1.20/t/getdate.t文件第159行
my $offset = Time::Local::timegm(0,0,0,1,0,70);
修改为
my $offset = Time::Local::timegm(0,0,0,1,0,1970);
即
改为
修改完以上错误后,再次执行./buildtools,可以编译成功。在编译过程中会有部分perl测试项未通过,出现提示
Hey! Some of the Perl tests failed! If you think this is okay, enter y now:
这时直接输入y即可
编译成功后,显示如下
验证toolset是否构建成功:在编译成功提示信息中的路径Top of SPEC benchmark tree is '/home/ubuntu/cpu2006'下执行:
ubuntu@ubuntu:~/cpu2006$ . ./shrc
ubuntu@ubuntu:~/cpu2006$ runspec -V
构建成功的tool都在/home/ubuntu/cpu2006/bin/中
在/home/ubuntu/cpu2006/tools/bin/下创建文件夹linux-riscv64,并在该文件夹下创建description文件。description文件用来描述新构建工具支持哪些系统和它构建的环境,运行install.sh时将会显示此文件内容,文件内容如下
回到/home/ubuntu/cpu2006目录,执行下面命令将toolset打包
ubuntu@ubuntu:~/cpu2006$ packagetools linux-riscv64
在/home/ubuntu/cpu2006/tools/bin/linux-riscv64下会生成tool,打好的包是/home/ubuntu/cpu2006目录下的linux-riscv64-118.tar
在/home/ubuntu/cpu2006目录下运行install.sh进行安装
ubuntu@ubuntu:~/cpu2006$ ./install.sh -u linux-riscv64 -d /home/ubuntu/cpu2006_install
其中-d后面是安装路径,安装过程中会遇到错误退出,这些错误是perl的一些测试项fail
查看runspec-test.linux-riscv64.out
解决方法:在tools/src/perl-5.12.3/Configure文件中的第4690行下面新增代码
因为修改了Configure文件,需要重新编译,重新编译完成后再按照1.3的内容进行打包,在安装打好包的toolset之前,先执行export SPEC_INSTALL_NOCHECK=1,跳过校验和检查,然后再次安装,就可以安装成功了。
如果不想在其他unmatched上重新编译,想直接将编译好并打好包的toolset移植上去,方法是
$ sudo mount cpu2006-1.2.iso /mnt
$ mkdir cpu2006
$ cp -r /mnt/* cpu2006/
$ chmod -R +w cpu2006/
$ cd cpu2006/
$ scp -r ubuntu@192.168.2.41:/home/ubuntu/cpu2006/linux-riscv64-118.tar ./ //将编译并打包好的toolset复制到当前路径下
$ sudo tar xvf linux-riscv64-118.tar
$ export SPEC_INSTALL_NOCHECK=1
$ mkdir ../cpu2006_install
$ ./install.sh -u linux-riscv64 -d /home/ubuntu/cpu2006_install
$ cd ../cpu2006_install
$ . ./shrc
经过上面的操作,就可以执行runspec命令进行测试了