error: implicit declaration of function 'rdtscl' [-Werror=implicit-function-declaration] (but no error when running on older kernel version)

error: implicit declaration of function 'rdtscl' [-Werror=implicit-function-declaration] (but no error when running on older kernel version)

我是新手,正在尝试在内核版本为 3.10.0-957.el7.x86_64 的虚拟机上编译程序。但是我得到这个错误:

/home/../../../isr_demux.c: In function 'demux0_isr':
/home/../../../ isr_demux.c: 782:3: error: implicit declaration of function 'rdtscl' [-Werror=implicit-function-declaration]`

我打开 isr_demux.c 并看到它所说的导致错误的代码片段是这样的:

倒数第三行是第 782 行。有趣的是,同一个文件在具有较旧内核版本 3.10.0-327.el7 的虚拟机上编译得很好。x86_64.

我在网上搜索了很多,但真的卡住了。我看到了另一个 post 并检查了我的头文件,并包含了 linux/proc_fs.h 和许多其他文件。有人说我可能缺少函数原型或定义,但添加原型并没有解决这个问题,定义函数导致重定义错误。

关于我是否仍然在某处缺少头文件有任何想法吗?或者,如果问题出在较新的内核本身,我可能需要找到某种补丁?谢谢!

网站 elixir.bootlin.com 对这些东西非常有用。以下 link 是在整个内核源代码树中搜索 3.10.108 版本的符号 rdtscl。

https://elixir.bootlin.com/linux/v3.10.108/ident/rdtscl

rdtscl 仅被定义为一个宏,因此在您收到有关 rdtscl 隐式声明的错误的地方,该宏似乎未定义。

rdtscl定义为宏的两个地方是: https://elixir.bootlin.com/linux/v3.10.108/source/arch/x86/include/asm/msr.h#L182 https://elixir.bootlin.com/linux/v3.10.108/source/arch/x86/include/asm/paravirt.h#L182

因此,如果您正在为 x86 构建(定义这些宏的头文件在 arch/x86 中),那么解决方法是包含正确的头文件,或者用其他内容替换对 rdtscl 的调用。