FATAL: modpost: GPL-incompatible module foo.ko uses GPL-only symbol 'paravirt_ops'

今週二度も同じような状況に出くわしたので書いておこう。まずは、nVidiaプロプライエタリなドライバをビルドする際に題名にあるエラーに遭遇した。調べてみると、/boot/System.map から paravirt_ops のアドレスを調べ、--defsym オプションで強制的にシンボルを定義して回避する方法が紹介されていた。こっそり MODULE_LICENSE("GPL") をソースのどこかに追加すればいいんじゃないかと思ってやってみたが、残念ながらバイナリ化された物体である nv-kernel.o の中にそいつはあったのだ。これでは仕方ない。

% nm nv-kernel.o | grep "__module"
00000000 R __module_license

次の遭遇は、VMware の monitor モジュール (vmmon) をビルドするときだった。こいつは MODULE_LICENSE をなぜか定義していないようだったので、例によって俺GPL化することにより解決。たぶんEULAは不履行だけど *1、頒布しないかぎり (日本の) 著作権法には違反しないと思われる。

しかし、ただの関数ポインタを含む構造体へのポインタ (ABI) なのに、なぜ EXPORT_SYMBOL_GPL なんだろうか。

% grep "paravirt_ops" /usr/src/linux-headers-2.6.21-1-k7/Module.symvers 
0x3badca44      paravirt_ops    vmlinux EXPORT_SYMBOL_GPL

paravirt_ops に関する経緯はここに詳しい。今は、なぜVMware必死になってVMIを押し進めてたのかが分かる気がする。

いや、nouveau とかの開発を助けられるくらい GPU について造詣が深まれば無問題なんですけどね。

*1:「私はファイルの編集に sedawk しか使ってないし、目隠しして作業したからリバースエンジニアリングはしていないし、変更されたソースコードには機能的な変更点が一切含まれていないから、派生物を作る行為にも該当しない」と主張してみようか