Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rocky Linux 9.4 でビルドが失敗する #28

Open
P-Kichi opened this issue May 12, 2024 · 2 comments
Open

Rocky Linux 9.4 でビルドが失敗する #28

P-Kichi opened this issue May 12, 2024 · 2 comments

Comments

@P-Kichi
Copy link

P-Kichi commented May 12, 2024

当方、Rocky Linux 9 で利用させて頂いております。
カーネルのバージョンが上がっても dkmsで自動ビルドする様にしていたのですが、先日 9.3 から 9.4 に
バージョンアップして以降、ビルドに失敗する様になりました。

[root@rocky9 driver]# cat /etc/rocky-release
Rocky Linux release 9.4 (Blue Onyx)

[root@rocky9 driver]# uname -a
Linux rocky9 5.14.0-427.16.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed May 8 17:48:14 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

手動でmakeしてみたところ、以下の通りエラーが発生します。

[[root@rocky9 driver]# pwd
/usr/src/px4_drv/driver

[root@rocky9 driver]# make
'revision.h' was updated.
make[1]: ディレクトリ '/usr/src/kernels/5.14.0-427.16.1.el9_4.x86_64' に入ります
  CC [M]  /usr/src/px4_drv/driver/driver_module.o
  CC [M]  /usr/src/px4_drv/driver/ptx_chrdev.o
次のファイルから読み込み:  ./include/linux/linkage.h:7,
         次から読み込み:  ./include/linux/preempt.h:10,
         次から読み込み:  ./include/linux/spinlock.h:56,
         次から読み込み:  ./include/linux/kref.h:16,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.h:13,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.c:9:
/usr/src/px4_drv/driver/ptx_chrdev.c: 関数 ‘ptx_chrdev_context_create’ 内:
./include/linux/export.h:17:22: エラー: 互換性のないポインタ型から 1 番目の ‘class_create’ の引数に渡しています [-Werror=incompatible-pointer-types]
   17 | #define THIS_MODULE (&__this_module)
      |                     ~^~~~~~~~~~~~~~~
      |                      |
      |                      struct module *
/usr/src/px4_drv/driver/ptx_chrdev.c:573:35: 備考: in expansion of macro ‘THIS_MODULE’
  573 |         ctx->class = class_create(THIS_MODULE, name);
      |                                   ^~~~~~~~~~~
次のファイルから読み込み:  ./include/linux/device.h:31,
         次から読み込み:  ./include/linux/cdev.h:8,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.h:16,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.c:9:
./include/linux/device/class.h:230:54: 備考: expected ‘const char *’ but argument is of type ‘struct module *’
  230 | struct class * __must_check class_create(const char *name);
      |                                          ~~~~~~~~~~~~^~~~
/usr/src/px4_drv/driver/ptx_chrdev.c:573:22: エラー: 関数 ‘class_create’ への引数が多すぎます
  573 |         ctx->class = class_create(THIS_MODULE, name);
      |                      ^~~~~~~~~~~~
次のファイルから読み込み:  ./include/linux/device.h:31,
         次から読み込み:  ./include/linux/cdev.h:8,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.h:16,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.c:9:
./include/linux/device/class.h:230:29: 備考: ここで宣言されています
  230 | struct class * __must_check class_create(const char *name);
      |                             ^~~~~~~~~~~~
cc1: いくつかの警告はエラーとして取り扱われます
make[2]: *** [scripts/Makefile.build:299: /usr/src/px4_drv/driver/ptx_chrdev.o] エラー 1
make[1]: *** [Makefile:1934: /usr/src/px4_drv/driver] エラー 2
make[1]: ディレクトリ '/usr/src/kernels/5.14.0-427.16.1.el9_4.x86_64' から出ます
make: *** [Makefile:19: px4_drv.ko] エラー 2
[[root@rocky9 driver]#

尚、もう一台 Rocky Linux 8 で録画サーバーを稼働させていますが、こちらは問題ありません。

[root@rocky8 ~]# cat /etc/rocky-release
Rocky Linux release 8.9 (Green Obsidian)

[root@rocky8 ~]# uname -a
Linux rocky8 4.18.0-513.24.1.el8_9.x86_64 #1 SMP Thu Apr 4 18:13:02 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

この問題を解決するにはどうすれば良いでしょうか?

@shirow-github
Copy link

tsukumijima@76408ca

@P-Kichi
Copy link
Author

P-Kichi commented May 13, 2024

早速のご回答ありがとうございます。
結論から申し上げますと最終的にはビルドに成功しましたが、ご提示頂いた
コードそのままでは同じエラーが発生しました。

#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0)
	ctx->class = class_create(name);
#else
	ctx->class = class_create(THIS_MODULE, name);
#endif

で、カーネルバージョンが6.4以上かどうかでclass_create() の呼び方を変えていますが、Rocky Linux 9.4 のカーネルバージョンは

[root@rocky9 ~]# uname -r
5.14.0-427.16.1.el9_4.x86_64

の通り 5.14 ですので else 以降の処理に分岐し、結果として古い(?)呼び出し方が選択されます。
(因みにそれまでビルドに成功していた Rocky Linux 9.3 のカーネルバージョンは 5.14.0-362.24.1 です)。

そこでこの分岐処理をカットし、単純に

ctx->class = class_create(THIS_MODULE, name);

ctx->class = class_create(name);

に変更してみたところ、ビルドに成功しました。

当方で発生した問題はこれで解決しましたが、この方法では Rocky Linux 8 や 9.3 以前では逆にエラーになると思いますので、可能でしたら汎用性を持たせて頂きたく、お願い致します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants