#linux #linux-kernel #embedded-linux
#linux #linux-ядро #встроенный-linux
Вопрос:
Я работаю над целью STM32MP1 с помощью yocto. В общем, я могу скомпилировать файл helloworld .ko и загрузить его в ядро. Но когда я хочу скомпилировать следующее:
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/types.h>
static struct platform_device *pdev;
static int __init fake_eth_add(void)
{
int inst_id = 0;
pdev = platform_device_alloc("fake-eth", inst_id);
platform_device_add(pdev);
pr_info("fake-eth added");
return 0;
}
static void __exit fake_eth_put(void)
{
pr_info("fake-fake removed");
platform_device_put(pdev);
}
module_init(fake_eth_add);
module_exit(fake_eth_put);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("John Madieu <john.madieu@gmail.com>");
Я получаю следующие ошибки:
ERROR: modpost: "platform_device_put" [/home/rdm/ethtest/eth-ins.ko] undefined!
ERROR: modpost: "platform_device_add" [/home/rdm/ethtest/eth-ins.ko] undefined!
ERROR: modpost: "platform_device_alloc" [/home/rdm/ethtest/eth-ins.ko] undefined!
Я проверяю, определен ли символ / функция platform_device_alloc, и он выполняет:
root@txmp-1570:/lib/modules/5.7.1/source/kernel# grep -w platform_device_alloc /proc/kallsyms
c0547cfc T platform_device_alloc
Теперь я узнал, что символы должны быть в файле Module.symvers с тегом EXPORT_SYMBOL_GPL. Символов там не было, поэтому я добавил их в файл Module.symvers:
0x00000000 platform_device_alloc vmlinux EXPORT_SYMBOL_GPL
0x00000000 platform_device_add vmlinux EXPORT_SYMBOL_GPL
0x00000000 platform_device_put vmlinux EXPORT_SYMBOL_GPL
Теперь код компилируется! Но когда я хочу загрузить его с помощью insmod, я получаю следующую ошибку:
root@txmp-1570:/home/rdm/ethtest# insmod eth-ins.ko
insmod: ERROR: could not insert module eth-ins.ko: Unknown symbol in module
И журналы dmseg:
[ 2954.658383] eth_ins: Unknown symbol platform_device_put (err -2)
[ 2954.664194] eth_ins: Unknown symbol platform_device_add (err -2)
[ 2954.672737] eth_ins: Unknown symbol platform_device_alloc (err -2)
Чего мне не хватает? Почему мне пришлось добавлять файл Module.symvers самостоятельно? Я что-то пропустил в отношении настройки среды для разработки драйверов ядра?
Комментарии:
1. «итак, я добавил это» — где вы это добавили?
2. @red0ct Я добавил 3 символа в файл Module.symvers, я просто отредактировал текст, чтобы сделать его более понятным.
3. @Milag Это уже есть в коде, который я опубликовал выше, или ты имеешь в виду что-то другое?
4. Должно быть, пропустил строку, компоновщик должен быть в состоянии разрешить эти символы
5. Вы не забыли «экспортировать неиспользуемые символы», когда создавали ядро?