2011年3月11日星期五

修正编译驱动模块时遇到的unknown field ‘ioctl’ specified in initializer错误

/!\ 没兴趣看我罗嗦废话的直接按照下文中蓝字部分执行应该就行了。

----------------------
今天心血来潮编译安装了 2.6.37.3的内核,结果发现原来好好的 vbox 虚拟机打不开了,错误提示: 让重新安装  virtualbox-ose-dkms 然后用 root 执行 modprobe vboxdrv 。

看来是新内核和现有的vbox驱动不兼容了。

按照提示执行:

sudo apt-get install virtualbox-ose-dkms

结果提示已经安装了最新版本的 。。也是啊,我以前都有的啊。

尝试执行 sudo dpkg-reconfigure virtualbox-ose-dkms 

就爆出一个错误。察看 /var/lib/dkms/virtualbox-ose/3.1.6/build/make.log 发现,问题出在 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c 文件的 第 92行,
 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c:92: error: unknown field ‘ioctl’ specified in initializer

vi +92 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c 看到那一行的内容是:
ioctl:      VBoxNetAdpLinuxIOCtl,

不知所以。上google。。。

结果发现这是个普遍的问题,这位仁兄说到了关键,
http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&ptid=1174031&pid=7323551

但是俺不知道怎么改。。。继续google,在某外国友人的论坛上发现了修改方法,一位好心的老兄给出了patch(代码):

 --- VBoxNetAdp-linux.c~ 2010-08-05 14:52:24.000000000 +0100
+++ VBoxNetAdp-linux.c  2010-09-17 13:34:23.000000000 +0100
@@ -60,7 +60,7 @@

 static int VBoxNetAdpLinuxOpen(struct inode *pInode, struct file *pFilp);
 static int VBoxNetAdpLinuxClose(struct inode *pInode, struct file *pFilp);
-static int VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, unsigned int uCmd, unsigned long ulArg);
+static long VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, unsigned int uCmd, unsigned long ulArg);

 /*****************************************************************************
 *   Global Variables                                                         *
@@ -83,7 +83,7 @@
     owner:      THIS_MODULE,
     open:       VBoxNetAdpLinuxOpen,
     release:    VBoxNetAdpLinuxClose,
-    ioctl:      VBoxNetAdpLinuxIOCtl,
+    unlocked_ioctl:      VBoxNetAdpLinuxIOCtl,
 };

 /** The miscdevice structure. */
@@ -246,7 +246,7 @@
  * @param   uCmd        The function specified to ioctl().
  * @param   ulArg       The argument specified to ioctl().
  */
-static int VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, unsned int uCmd, unsigned long ulArg)
+static long VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, ungned int uCmd, unsigned long ulArg)
 {
     VBOXNETADPREQ Req;
     PVBOXNETADP pAdp;


但是别高兴的太早。这个补丁俺打上去的时候被拒绝了,还好补丁的内容不多,俺手动改!!!,

首先将 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c 的第92行:
ioctl:      VBoxNetAdpLinuxIOCtl,
改为:
 unlocked_ioctl:      VBoxNetAdpLinuxIOCtl,

然后搜索: int VBoxNetAdpLinuxIOCtl , 找到函数定义代码,将 int 改为 long.

现在为止,已经成功一半。

现在 进入 /usr/src/virtualbox-ose-3.1.6/vboxdrv 目录执行,sudo make install && sudo modprobe vboxdrv, ok ,如果不出错的话,vbox现在已经修复了。

为什么这么简单的一句命令我称之为一半呢?因为我当时天真的认为,直接执行下 sudo dpkg --configure virtualbox-ose-dkms 就可以了。谁知道它们竟然聪明的将我改的代码覆盖了。。。


--
yaoms

没有评论:

发表评论