'getnstimeofday' является неявным объявлением в системном вызове, когдаобъявлен - PullRequest
0 голосов
/ 15 мая 2018

Anwser

решаемые !! Благодаря @ IanAbbott

заголовок должен быть:

#include <linux/ktime.h>
#include <linux/timekeeping.h>

, а не <linux/time.h>.

Подробнее см. Обсуждение.


Оригинальный вопрос

Я пишу имена системных вызовов sys_my_time.c, которые будут использовать getnstimeofday(). Я импортировал <linux/time.h>. Код вроде этого:

#include <linux/kernel.h>
#include <linux/linkage.h>
#include <linux/time.h>

asmlinkage int sys_my_time() {
  struct timespec t;
  getnstimeofday(&t);
  // ...
  return 0;
}

Но при компиляции ошибка показывает:

CC      kernel/sys_my_time.o
kernel/sys_my_time.c: In function ‘sys_my_time’:
kernel/sys_my_time.c:8:3: error: implicit declaration of function ‘getnstimeofday’ [-Werror=implicit-function-declaration]
getnstimeofday(&t);
^
cc1: some warnings being treated as errors
scripts/Makefile.build:320: recipe for target 'kernel/sys_my_time.o' failed
make[1]: *** [kernel/sys_my_time.o] Error 1
Makefile:1029: recipe for target 'kernel' failed
make: *** [kernel] Error 2

Понятия не имею, почему происходит ошибка?

пс. компилирование ядра V4.14.25 в Ubuntu 16.04

1 Ответ

0 голосов
/ 13 июня 2018

Начиная с версии ядра 3.17.x, getnstimeofday больше не объявляется #include <linux/time.h>.Решение состоит в том, чтобы добавить:

#include <linux/ktime.h>

В зависимости от версии ядра, #include <linux/ktime.h> извлечет объявление getnstimeofday из <linux/time.h> (до 3.17.x) или из <linux/timekeeping.>(для версии 3.17.x и далее).Нет необходимости включать <linux/timekeeping.h> напрямую.

Обратите внимание, что <linux/ktime.h> был доступен начиная с ядра Linux 2.6.16 и выше.

Возможно, вы сможете удалить #include <linux/time.h>, еслитам нет ничего другого, что вам нужно использовать.Проверьте это, удалив строку и собрав код для любого ядра 3.17.x или новее.

...