читайте свою же фразу про "бинарную часть" драйвера от той же NVIDIA;
Давайте я для совсем тупых повторю целых 3 раза ... как для милиционера

:
- в shell-скрипте можно зашифровать (в хвосте) любую информацию и любым способом...
- с которой этот shell-скрипт знает как и может работать...
- в частности, он извлекает программный код (исходный!) и запускает его сборку;
- но от того, что зашифрованные байты выглядят как бинарная бессмыслица, эта бессмыслица не становится исполнимым бинарным кодом.
Ещё раз, как для милиционера (по разделениям: "делай раз - делай два" - конспектируйте, пока я жив

): Linux устроен так (довольно примитивно), что код модулей ядра обращается к функциям API ядра тупо по их
абсолютным адресам, см. например:
Код:
olej@ACER:~$ sudo cat /proc/kallsyms | grep ' T ' | grep kmalloc
ffffffffb7dc3510 T mempool_kmalloc
ffffffffb7deefe0 T kmalloc_order
ffffffffb7def010 T kmalloc_order_trace
ffffffffb7df0ac0 T kmalloc_slab
ffffffffb7e362d0 T __kmalloc
ffffffffb7e36500 T __kmalloc_node
ffffffffb7e39510 T __kmalloc_track_caller
ffffffffb7e39720 T __kmalloc_node_track_caller
ffffffffb812c9b0 T devm_kmalloc
ffffffffb81bd6e0 T sock_kmalloc
ffffffffb9088933 T create_kmalloc_cache
ffffffffb9088a18 T setup_kmalloc_cache_index_table
ffffffffb9088a1e T create_kmalloc_caches
ffffffffb9178e40 T kmalloc_info
А
поэтому, стоит внести
любые изменения в ядро, например пересобрать его с другими CONFIG параметрами - как загрузка или выполнение кода любого модуля может завершиться мгновенным крахом системы: глухо-немым и безнадёжным.
А
поэтому, все модули ядра могут собираться
только под совершенно определённое ядро (по версии, по подверсии, по сборке, по CONFIG, ...) + при любом изменении ядра все модули должны
замещаться соответствующими версиями.
Для модулей из состава дерева исходных кодов ядра (kernel.org) это замещение за вас делает майнтейнер дистрибутива, комплектуя модули в комплекте с ядром.
А для любых
сторонних модулей вы должны делать сборку. А DKMS (Dynamic Kernel Module Support) - это
всего лишь фреймворк, который запускает
сборку динамически при обновлениях ядра ... и ничего более - всё
ту же сборку.
А
поэтому, модули ядра (драйверы) в Linux могут присутствовать
только в виде исходных кодов на языке C, для пересборки при любых обновлениях...
и никак иначе!
Законспектировали?
P.S. Надеюсь что я не напрасно потерял время на "так много букаф", и кому-то поразумнее из изучающих Linux это тоже пригодится.
