因工作需要,编译mips版本的静态iozone工具。
1,源码地址:Index of /src/current (iozone.org)
当时实测过两个版本
wget https://www.iozone.org/src/current/iozone3_482.tar
wget https://www.iozone.org/src/current/iozone3_506.tar
因为有编译问题,想使用新版本跳过问题,结果发现不行。
2,解压与编译:
tar -xvf ../iozone3_506.tar
交叉编译使用src/current/makefile文件,查看all目标可以看出iozone对不同架构有不同的支持,指定工具链后,就可以选择不同的目标,如arm 就有linux-arm或者android等,如果是riscv/mips平台那就要选择linux,之前选择generic 编译出来是可以,但执行时有问题,但选择linux 后,静态链接又有问题。
修改makefile中
CC = cc 为
CC = mips-linux-gnu-gcc -static ,static是因为我需要静态链接,此处需要查看具体目标,有些目标使用GCC。
vim打开修改后,如果提示只读,需要使用wq!保存。
make linux
此时会报错,我不确定其他架构编译器是否会有问题,如果没有问题,那么iozone就编译出来了。
我编译时报错如下:
mips-linux-gnu/libc/usr/lib/librt.a(aio_misc.o): In function `handle_fildes_io':
../sysdeps/pthread/aio_misc.c:(.text+0x1a0): undefined reference to `pthread_getschedparam'
...
此时会报八九项pthread相关的undefined的错误,而且错误原因是mips编译器的rt库中使用了未定义的pthread相关变量或者函数,这时我使用mips-linux-gnu-nm读取了我mips工具链的libpthread.a库,里面存在这些符号,搞的我很懵,尝试了改变-static选项的位置,但是不起作用。
最后在同事提示下修改的-lrt与-lpthread的位置,解决了这个问题,因为对编译器了解不深入,确实不知道这是这么情况,所以记录一下吧。
找到编译makefile target linux的位置,iozone3_506 的src/current/makefile 的174行,把-lrt提到 -lpthread前面,再执行make linux,就可以成功编译出mips版本的静态的iozone工具了。
iozone功能测试对内存有要求,如果内存较小,会导致oom。
./iozone -t 5 -b t5.xls -t是多线程,-b是输出,iozone默认输出xls格式。