报错信息如下:
In file included from /tmp/vbox.0/combined-os-specific.c:44:0:
/tmp/vbox.0/r0drv/linux/memuserkernel-r0drv-linux.c: 在函数‘VBoxGuest_RTR0MemUserIsValidAddr’中:
/tmp/vbox.0/r0drv/linux/memuserkernel-r0drv-linux.c:82:55: 错误:宏“access_ok”传递了 3 个参数,但只需要 2 个
bool fRc = access_ok(VERIFY_READ, (void *)R3Ptr, 1);
^
/tmp/vbox.0/r0drv/linux/memuserkernel-r0drv-linux.c:82:16: 错误:‘access_ok’未声明(在此函数内第一次使用)
bool fRc = access_ok(VERIFY_READ, (void *)R3Ptr, 1);
^~~~~~~~~
/tmp/vbox.0/r0drv/linux/memuserkernel-r0drv-linux.c:82:16: 附注:每个未声明的标识符在其出现的函数内只报告一次
make[2]: *** [scripts/Makefile.build:303:/tmp/vbox.0/combined-os-specific.o] 错误 1
make[2]: *** 正在等待未完成的任务....
make[1]: *** [Makefile:1667: _module_/tmp/vbox.0] Error 2
make: *** [/tmp/vbox.0/Makefile-footer.gmk:133: vboxguest] Error 2
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
cannot verify if kernel modules and services were reloaded
上面文章介绍的是欧拉,麒麟和文章中几乎一摸一样,报错的原因是:
access_ok函数在Linux内核5版本之后由传三个参数被改为了传两个参数,VBoxAdditions根据Linux版本号是4.x.x还是5.x.x来进行判断传三个还是两个参数,而麒麟使用的内核版本号为4,却已经合并了Linux内核5.x.x版本之后的补丁,也就是access_ok函数只要两个参数,因而我们只需要更改VBoxAdditions源代码,让它在4.x.x时也使用两个参数调用access_ok就行啦!
#修改VBoxAdditions源代码(注意根据VBoxAdditions版本号更改对应路径)
cd /opt/VBoxGuestAdditions-7.0.8/src/vboxguest-7.0.8/vboxguest/r0drv/linux
vi memuserkernel-r0drv-linux.c
#使用i进行编辑,将以下两处RTLNX_VER_MIN(5,0,0)改为RTLNX_VER_MIN(4,0,0)即可啦
#可以直接搜索RTLNX_VER_MIN(5
修改后,保存退出
#随后还有一个文件中需要更改该函数问题,继续执行命令:
cd ../../../vboxsf
vi regops.c
#同样,也是执行上面搜索,然后保存退出,这个文件只有一个地方需要修改
/sbin/rcvboxadd setup