あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

RPi2でドライバーをコンパイルするとExec format errorなモジュールができるやつの続き

Raspberry Pi 2でドライバーをコンパイルするとExec format errorなモジュールができる - あっきぃ日誌 のつづき。前回の記事はほぼ間違いでした。失礼しました。あ、いや、RPi1ならRPi1でコンパイル、RPi2ならRPi2でコンパイル、もしくはクロスコンパイル、と言うのはあってますん。

さて、色々調べていたら、別のドライバでの話ですが、コンパイルしてもExec format Errorだよっていうスレッドがフォーラムにあがってました。で、なんかヘッダーファイルをこれに差し替えろと言う話題があるわけです。

Raspberry Pi • View topic - Multi-console gamepad driver for GPIO

野良パッケージですが、入れてみたところドライバーのコンパイルができてかつmodprobeも成功しました。ほほうーー。で、何が違うのよ、と、野良パッケージとソースとでdiffをとってみたらこれ。

$ sudo diff -Naur /lib/modules/3.18.7-v7+/build/include/ /lib/modules/3.18.7-v7+/source/include
diff -Naur /lib/modules/3.18.7-v7+/build/include/config/auto.conf /lib/modules/3.18.7-v7+/source/include/config/auto.conf
--- /lib/modules/3.18.7-v7+/build/include/config/auto.conf	2015-02-16 14:44:22.917906906 +0900
+++ /lib/modules/3.18.7-v7+/source/include/config/auto.conf	2015-02-16 13:05:57.428174766 +0900
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/arm 3.18.7 Kernel Configuration
+# Linux/arm 3.18.7+ Kernel Configuration
 #
 CONFIG_IP6_NF_MATCH_AH=m
 CONFIG_NLS_CODEPAGE_861=m
diff -Naur /lib/modules/3.18.7-v7+/build/include/config/auto.conf.cmd /lib/modules/3.18.7-v7+/source/include/config/auto.conf.cmd
--- /lib/modules/3.18.7-v7+/build/include/config/auto.conf.cmd	2015-02-16 14:44:22.817907361 +0900
+++ /lib/modules/3.18.7-v7+/source/include/config/auto.conf.cmd	2015-02-16 13:05:57.008175259 +0900
@@ -979,7 +979,7 @@
 include/config/auto.conf: \
 	$(deps_config)
 
-ifneq "$(KERNELVERSION)" "3.18.7"
+ifneq "$(KERNELVERSION)" "3.18.7+"
 include/config/auto.conf: FORCE
 endif
 ifneq "$(ARCH)" "arm"
diff -Naur /lib/modules/3.18.7-v7+/build/include/config/kernel.release /lib/modules/3.18.7-v7+/source/include/config/kernel.release
--- /lib/modules/3.18.7-v7+/build/include/config/kernel.release	2015-02-16 14:44:25.487895234 +0900
+++ /lib/modules/3.18.7-v7+/source/include/config/kernel.release	2015-02-16 13:06:00.418171128 +0900
@@ -1 +1 @@
-3.18.7-v7
+3.18.7+-v7
diff -Naur /lib/modules/3.18.7-v7+/build/include/config/tristate.conf /lib/modules/3.18.7-v7+/source/include/config/tristate.conf
--- /lib/modules/3.18.7-v7+/build/include/config/tristate.conf	2015-02-16 14:44:22.917906906 +0900
+++ /lib/modules/3.18.7-v7+/source/include/config/tristate.conf	2015-02-16 13:05:57.428174766 +0900
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/arm 3.18.7 Kernel Configuration
+# Linux/arm 3.18.7+ Kernel Configuration
 #
 CONFIG_IP6_NF_MATCH_AH=M
 CONFIG_NLS_CODEPAGE_861=M
diff -Naur /lib/modules/3.18.7-v7+/build/include/generated/autoconf.h /lib/modules/3.18.7-v7+/source/include/generated/autoconf.h
--- /lib/modules/3.18.7-v7+/build/include/generated/autoconf.h	2015-02-16 14:44:22.917906906 +0900
+++ /lib/modules/3.18.7-v7+/source/include/generated/autoconf.h	2015-02-16 13:05:57.428174766 +0900
@@ -1,7 +1,7 @@
 /*
  *
  * Automatically generated file; DO NOT EDIT.
- * Linux/arm 3.18.7 Kernel Configuration
+ * Linux/arm 3.18.7+ Kernel Configuration
  *
  */
 #define CONFIG_IP6_NF_MATCH_AH_MODULE 1
diff -Naur /lib/modules/3.18.7-v7+/build/include/generated/utsrelease.h /lib/modules/3.18.7-v7+/source/include/generated/utsrelease.h
--- /lib/modules/3.18.7-v7+/build/include/generated/utsrelease.h	2015-02-16 14:44:25.907893327 +0900
+++ /lib/modules/3.18.7-v7+/source/include/generated/utsrelease.h	2015-02-16 13:06:00.828170610 +0900
@@ -1 +1 @@
-#define UTS_RELEASE "3.18.7-v7"
+#define UTS_RELEASE "3.18.7+-v7"


カーネルバージョンは、RPi1向けが3.18.7+で、RPi2向けが3.18.7-v7+なはずですが、RPi2でソースを用意*1すると、+が付く位置がおかしくなって「3.18.7+-v7」とか言う謎バージョンになるために問題がおこるようです。3.18.7-v7と3.18.7-v7+の違いは許されるのは……なぜだろう?

ちなみにRPi1でソースを用意するとこうなってました。

#define UTS_RELEASE "3.18.7+"

調べてる間に知ったmodinfoコマンドでドライバーモジュールを調べても確かにそうなってました。見落としてた。。。

vermagic:       3.18.7+-v7 SMP preempt mod_unload modversions ARMv7 (おかしい)
vermagic:       3.18.7-v7 SMP preempt mod_unload modversions ARMv7 (ただしい)

vermagic:       3.18.7+ preempt mod_unload modversions ARMv6 (RPi1向けの場合)
vermagic:       3.18.7-v7+ SMP preempt mod_unload modversions ARMv7 (RPi2にバンドルされてるモジュール)

末尾の+の有無が特に問題にならないところがよくわからないままですが、ひとまずドライバーが動くようになってよかった。。。

*1:rpi-sourceで用意してます