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で用意してます