あっきぃ日誌

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

Raspberry Pi 2でドライバーをコンパイルするとExec format errorなモジュールができる

CPUが違うのだから当たり前の話な感じでしたん……。

Raspberry Pi 2ではCPUが変わってarchがarmv7l(soft-float)になりました。が、OSのバイナリ自体は、RPi2より前のモデルのCPUであるarmv6l(hard-float)向けにビルドされています。

つまり、RPi2でmakeすると出来上がるのはarmv7l向けのバイナリで、armv6lなLinuxとは合いませんmodprobeしてもExec format errorになるのはこのせいでした。

たぶん、コンパイルオプションを付けるとか、クロスコンパイル環境が必要になると思うのですが、あれこれ考えるより、旧モデルでコンパイルしたほうが気が楽かなと思いました。

コンパイルオプションは-march armv6 -mfloat-abi=hardを付けて、GW-450Dのソースコードコンパイルを試してみましたが、-mfloat-abi=softが先に付いているっぽくて、gccにどっちかにしてと怒られてしまいました。Makefileとかを見るにそれが記述されるところはなさそうだったのだけれどなあ。

と言うメモ。

(追記)これ、改めて確認したらRPi2はやっぱりダメでした(RPi1はいけた)。ので、いったん全取り消し。ややこしいですねこれ……。

あと、色々調べてたら、GW-450Dのコンパイル方法をイマドキ風にスパっとやる方法があったのでペタリ。rpi-source便利でした。

GW-450DやWN-AC433UKをRaspberry Piで使う - 簡潔なQ

あと、ヘッダファイルの書き換えが必要になってたのもちょい前に自分でも調べてて気づいてたけど、これもちゃんとまとまっています(たしかに先にブクマついててなるほどとなった)

linux - Error compiling drivers for Ralink RT2870 - Unix & Linux Stack Exchange