ошибка: неявное объявление функции 'rdtscl' [-Werror = неявное объявление-функции] (но без ошибки при запуске в более старой версии ядра) - PullRequest
0 голосов
/ 28 июня 2019

Я новичок во всем этом и пытаюсь скомпилировать программу на виртуальной машине с версией ядра 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 и увидел, что фрагмент кода, который, как он сказал, вызывает ошибку, таков: enter image description here

От третьей до последней строки - строка 782. Интересно то, что этот же файл прекрасно компилируется на виртуальной машине с более старой версией ядра 3.10.0-327.el7.x86_64.

Я много искал в Интернете, но действительно застрял. Я увидел другой пост и проверил мои заголовочные файлы, включив linux/proc_fs.h вместе со многими другими. Кто-то сказал, что я мог пропустить прототип или определение функции, но добавление прототипа не исправило это, и определение функции привело к ошибке переопределения.

Есть идеи о том, что я до сих пор где-то пропускаю заголовочный файл? Или, если проблема в самом новом ядре, и мне может понадобиться найти какой-нибудь патч? Спасибо!

1 Ответ

0 голосов
/ 30 июня 2019

Сайт elixir.bootlin.com очень полезен для этих целей. Следующая ссылка - это поиск по всему дереву исходных кодов ядра для версии 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 чем-то другим.

...