[PC周辺] VMware Workstation 4.5.3 build-19414 + vmware-any-any-update110 + Linux 2.6.22 git 20070720版 (mm_struct.dumpable and unregister_chrdev) (20070721)

まず,vmmon の compile で

Using 2.6.x kernel build system.
make: ディレクトリ `/tmp/vmware-config0/vmmon-only' に入ります
make -C /usr/src/linux-headers-2.6.22-2007072001/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' に入ります
  CC [M]  /tmp/vmware-config0/vmmon-only/linux/driver.o
/tmp/vmware-config0/vmmon-only/linux/driver.c: In function '__LinuxDriver_Ioctl':
/tmp/vmware-config0/vmmon-only/linux/driver.c:1833: error: 'struct mm_struct' has no member named 'dumpable'
make[2]: *** [/tmp/vmware-config0/vmmon-only/linux/driver.o] エラー 1
make[1]: *** [_module_/tmp/vmware-config0/vmmon-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' から出ます
make: *** [vmmon.ko] エラー 2
make: ディレクトリ `/tmp/vmware-config0/vmmon-only' から出ます
Unable to build the vmmon module.

とかでこける.これは <URL:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6c5d523826dc639df709ed0f88c5d2ce25379652> の影響.mm_struct.dumpable に変更があったとのこと.

diff -uwr vmmon-only/linux/driver.c vmmon-only.new/linux/driver.c
--- vmmon-only/linux/driver.c   2007-04-09 10:20:35.000000000 +0900
+++ vmmon-only.new/linux/driver.c       2007-07-21 18:18:34.000000000 +0900
@@ -1494,6 +1494,26 @@
  */

 #include <linux/sched.h>
+static void set_dumpable0(struct mm_struct *mm, int value)
+{
+       switch (value) {
+       case 0:
+               clear_bit(MMF_DUMPABLE, &mm->flags);
+               smp_wmb();
+               clear_bit(MMF_DUMP_SECURELY, &mm->flags);
+               break;
+       case 1:
+               set_bit(MMF_DUMPABLE, &mm->flags);
+               smp_wmb();
+               clear_bit(MMF_DUMP_SECURELY, &mm->flags);
+               break;
+       case 2:
+               set_bit(MMF_DUMP_SECURELY, &mm->flags);
+               smp_wmb();
+               set_bit(MMF_DUMPABLE, &mm->flags);
+               break;
+       }
+}
 static int
 __LinuxDriver_Ioctl(
                   struct file *filp,
@@ -1830,7 +1850,7 @@
           current->egid == current->gid &&
          current->fsgid == current->gid) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 7)
-        current->mm->dumpable = 1;
+        set_dumpable0(current->mm, 1);
 #else
         current->dumpable = 1;
 #endif

という感じでやるきなしなし対応.

set_dumpable(current->mm, 1);

として,include/linux/sched.h に用意されているっぽい

extern void set_dumpable(struct mm_struct *mm, int value);

を使ってもいいのだけれども,insmod 時に

vmmon: Unknown symbol set_dumpable

とかでこけるようになる(上記 pache は fs/exec.c から set_dumpable を copy して流用している).

次に,vmnet の compile で,

make: ディレクトリ `/tmp/vmware-config0/vmnet-only' に入ります
make -C /usr/src/linux-headers-2.6.22-2007072001/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' に入ります
  CC [M]  /tmp/vmware-config0/vmnet-only/driver.o
/tmp/vmware-config0/vmnet-only/driver.c: In function 'cleanup_module':
/tmp/vmware-config0/vmnet-only/driver.c:531: error: void value not ignored as it ought to be
make[2]: *** [/tmp/vmware-config0/vmnet-only/driver.o] エラー 1
make[1]: *** [_module_/tmp/vmware-config0/vmnet-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' から出ます
make: *** [vmnet.ko] エラー 2
make: ディレクトリ `/tmp/vmware-config0/vmnet-only' から出ます
Unable to build the vmnet module.

とかでこける.これは <URL:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e53252d97e670a38b1d2e9723b48077bba11ddda>

-extern int unregister_chrdev(unsigned int, const char *);
+extern void unregister_chrdev(unsigned int, const char *);

といった変更による.ということで,

diff -uwr vmnet-only/driver.c vmnet-only.new/driver.c
--- vmnet-only/driver.c 2007-05-14 15:03:03.000000000 +0900
+++ vmnet-only.new/driver.c     2007-07-21 18:29:45.000000000 +0900
@@ -528,11 +528,7 @@
    int retval;

    unregister_ioctl32_handlers();
-   retval =  unregister_chrdev(VNET_MAJOR_NUMBER, "vmnet");
-   if (retval != 0 ) {
-      LOG(0, (KERN_WARNING "/dev/vmnet: could not unregister major device %d\n", 
-             VNET_MAJOR_NUMBER));
-   }
+   unregister_chrdev(VNET_MAJOR_NUMBER, "vmnet");
    VNetProtoUnregister();
    VNetProc_Cleanup();
 #ifdef CONFIG_NETFILTER

といった感じに.

[PC周辺] VMware Workstation 4.5.3 build-19414 + vmware-any-any-update110 + Linux 2.6.22 git 20070719版 (20070720)

[myn:2007062600] の続き.

の組み合わせの場合の話.で,前回の

とかいった話は,vmware-any-any-update110 で対応されているっぽい. ちなみに any-any patch は今までは <URL:http://ftp.cvut.cz/vmware/> で配布されていたんですが,vmware-any-any-update110 は <URL:http://knihovny.cvut.cz/ftp/pub/vmware/> にあって, まだあまり Google にひっかかってくれません.

今回の問題は include/asm/page.h の,

static inline pte_t native_make_pte(unsigned long val)
{
       return (pte_t) { .pte_low = val };
}

の箇所.前回 はこれをまるごと comment out して対応したのであるが,この 関数を他の .h (linux の) が参照しているらしく,comment out すると compile がとおらなくなる.ということで,

static inline pte_t native_make_pte(unsigned long val)
{
       pte_t t;
       t.pte_low=val;
       return t;
}

とか適当にそれっぽく修正して対応.やるきなしなし.

関連リンク

[PC周辺] __ctype_b, __ctype_tolower, and __ctype_toupper of glibc 2.6-2 (20070719)

[myn:2007021000] の続き.

undefined reference to `__ctype_b'
undefined reference to `__ctype_tolower'
undefined reference to `__ctype_toupper'

とかで怒られるというあれ.いわゆる上記の symbol 入り libc をつくる件.

% apt-get source glibc (これで glibc-2.6 という directory ができる)
% cd glibc-2.6
% head -1 debian/changelog
glibc (2.6-2) unstable; urgency=low
% emacs debian/changelog
C-c C-v (要 debian-changelog-mode)
2.6-3 となるところをなんとなく 2.6-3.1 とかに修正
C-c C-f, C-x C-s, C-x C-c
% head -1 debian/changelog
glibc (2.6-3.1) unstable; urgency=low
% cp somewhere/glibc26-ctype-compat.dpatch debian/patches/any
% echo any/glibc26-ctype-compat.dpatch >> debian/patches/series

ここまでが下準備.

glibc26-ctype-compat.dpatch は自前で用意したので <URL:http://myn.meganecco.org/files/glibc26-ctype-compat.dpatch> に置いてあります (無保証).

で,前回

% nice -19 fakeroot make -f debian/rules binary \
"RUN_TESTSUITE=no" \
"DEB_INDEP_REGULAR_PACKAGES=locales" \
"DEB_ARCH_REGULAR_PACKAGES=libc6 libc6-dev libc6-amd64 libc6-dev-amd64" \
"DEB_UDEB_PACKAGES=" \
"GLIBC_PASSES=libc nptl amd64"

とかで OK だったのであるが,今回は,

% nice -19 fakeroot make -f debian/rules binary \
"RUN_TESTSUITE=no" \
"DEB_INDEP_REGULAR_PACKAGES=locales" \
"DEB_ARCH_REGULAR_PACKAGES=libc6 libc6-dev libc6-i686 libc6-xen libc6-amd64 libc6-dev-amd64" \
"DEB_UDEB_PACKAGES=" \
"GLIBC_PASSES=libc i686 xen amd64"

という感じで,

xen は不要なのであるが,これがなければ

# extra_debhelper_pkg_install is used for debhelper.mk only.
# when you want to install extra packages, use extra_pkg_install.
mkdir -p debian/libc6-dev/usr/lib/xen
cp -af debian/tmp-xen/usr/lib/*.a debian/libc6-dev/usr/lib/xen
cp: cannot stat `debian/tmp-xen/usr/lib/*.a': そのようなファイルやディレクトリはありません
make: *** [/home/myn/glibc-2.6/stamp-dir/binaryinst_libc6-dev] エラー 1

とかで build に失敗するので.

関連リンク

このページのインデックス


Last-modified: Sat Jul 21 18:32:39 +0900 2007

全インデックス