Как предотвратить ошибку: «символ» здесь не объявлен, несмотря на EXPORT_SYMBOL в модуле ядра Linux?

Я встраиваю какой-то драйвер в ядро ​​​​Linux, когда получаю эту ошибку (я добавляю устройство в файл платы и регистрирую его):

error: 'kxtf9_get_slave_descr' undeclared here (not in a function)

Я нашел функцию выше в файле драйвера

struct ext_slave_descr *kxtf9_get_slave_descr(void)
{
    return &kxtf9_descr;
}
EXPORT_SYMBOL(kxtf9_get_slave_descr);

Разве это не должно быть сделано «видимым» с помощью EXPORT_SYMBOL? Файл C, содержащий приведенный выше код, не имеет заголовочного файла (я его не писал, я просто нашел его я говорю, что это реализовано. предположим, что заголовок не нужен?

Остальной код компилируется отлично (поэтому он «видит» код в папке), и файл, содержащий приведенный выше код, тоже компилируется!


person stef    schedule 12.07.2011    source источник
comment
Минимальный рабочий пример: stackoverflow.com/questions/12311867/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 18.06.2017


Ответы (1)


EXPORT_SYMBOL экспортирует символ для динамической компоновки. То, что у вас есть, - это не ошибка компоновки, а ошибка компиляции из-за отсутствия объявления функции. Вы должны либо написать файл заголовка для файла C и включить этот файл заголовка, либо объявить функцию файла C, который вы компилируете.

Вариант 1:

kxtf9.h:

#ifndef KXTF9_H
#define KXTF9_H

struct ext_slave_descr *kxtf9_get_slave_descr(void);

#endif

ваш_файл.c:

#include "kxtf9.h"
/* your code where you use the function ... */

Вариант 2:

ваш_файл.c:

struct ext_slave_descr *kxtf9_get_slave_descr(void);
/* your code where you use the function ... */

Также обратите внимание, что вокруг EXPORT_SYMBOL в файле kxtf9.c стоит #ifdef __KERNEL__, поэтому вам необходимо правильно настроить среду сборки (Makefile), иначе вы получите ошибку ссылки.

person Antti    schedule 12.07.2011