如果编译模块时头文件与内核不匹配会发生什么?

问题描述

我们正在重新编译 64 位 Centos 8.1 的设备驱动程序 (4.18.0-147.el8.x86_64 #1 SMP Wed Dec 4 21:51:45 UTC 2019 x86_64) 但编译失败,因为 { 的签名{1}} 已更改为不再返回值。

从 Centos 存档安装与正在运行的内核(snd_pcm_lib_preallocate_pages_for_all())匹配的 kernel-devel 包,kernel-devel-4.18.0-147.el8.x86_64.rpm 中的函数返回 'void':

pcm.h

但是...根据elixir.bootlin,该函数从内核2.6返回void snd_pcm_lib_preallocate_pages_for_all(...),直到内核v5.1,此时它从int变为int .所以对于同一个内核版本,Centos源和官方内核源的void是不同的。

现在,编程问题:

模块源代码需要一个返回值:

pcm.h

由于 ret = snd_pcm_lib_preallocate_pages_for_all( pDevice... 只是文件我不知道实际的函数是否返回一个值。 Centos 的标题似乎太新了。

在 C 中,如果我调用函数,期望返回值,但函数实际上没有返回值,会发生什么??

我想它会通过从堆栈中提取“返回”值来弄乱堆栈,而实际上是其他数据。

正确吗?

(我应该相信 Centos 头文件还是 Linux 内核头文件?)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)