LKM - не может скомпилировать модуль - отсутствуют файлы заголовков, но установлены пакеты заголовков - PullRequest
0 голосов
/ 24 января 2019

Итак, я пытался скомпилировать простой LKM "Hello world" на моем Ubuntu 18.04 с установленным 4.15.0-43-generic и установленным linux-headers-4.15.0-43.

Thisэто код:

#define MODULE
#define LINUX
#define __KERNEL__

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    printk(KERN_DEBUG "Hello World!");
    return 0;
}

module_init( init_module );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Hello world");

Это мой Makefile:

CC      := gcc
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -c $(WARN) $(INCLUDE)
SOURCES := helloworld.c
TARGET  := helloworld.ko

all:
    $(CC) $(CFLAGS) $(SOURCES) -o $(TARGET)

Это содержимое /lib/modules/$(uname -r)/build/include

acpi  asm-generic  clocksource  config  crypto  drm  dt-bindings  generated  keys  kvm  linux  math-emu  media  memory  misc  net  pcmcia  ras  rdma  scsi  soc  sound  target  trace  uapi  video  xen

, и я получил fatal error: asm/barrier.h: No such file or directory чего следовало ожидать, потому что asm dir там нет.Смотрите полный вывод:

gcc -O2 -c -W -Wall -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/`uname -r`/build/include helloworld.c -o helloworld.ko
In file included from /usr/src/linux-headers-4.15.0-43/include/linux/init.h:5:0,
                 from helloworld.c:5:
/usr/src/linux-headers-4.15.0-43/include/linux/compiler.h:247:10: fatal error: asm/barrier.h: No such file or directory
 #include <asm/barrier.h>
          ^~~~~~~~~~~~~~~
compilation terminated.
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1

Верно ... поэтому я подумал, что если я создам символическую ссылку asm-generic для asm?

sudo ln -s /lib/modules/$(uname -r)/build/include/asm-generic /lib/modules/$(uname -r)/build/include/asm

ls -ld /lib/modules/$(uname -r)/build/include/asm подтверждает ссылкуесть ли:

lrwxrwxrwx 1 root root 56 Jan 24 19:51 /lib/modules/4.15.0-43-generic/build/include/asm -> /lib/modules/4.15.0-43-generic/build/include/asm-generic

Все должно работать правильно?Нет :( Теперь он жалуется, что asm/thread_info.h не может быть найдено (после того, как я сделал символическую ссылку).

gcc -O2 -c -W -Wall -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/`uname -r`/build/include helloworld.c -o helloworld.ko
In file included from /lib/modules/4.15.0-43-generic/build/include/asm/preempt.h:5:0,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/preempt.h:81,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/spinlock.h:51,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/seqlock.h:36,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/time.h:6,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/stat.h:19,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/module.h:10,
                 from helloworld.c:6:
/usr/src/linux-headers-4.15.0-43/include/linux/thread_info.h:38:10: fatal error: asm/thread_info.h: No such file or directory
#include <asm/thread_info.h>
         ^~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1

Я с самого начала знал, что символическая ссылка была плохой идеей.

Я такжепопытался включить /usr/src/linux-headers-4.15.0-43/include вместо /lib/modules/..., но, короче говоря, каталог "asm" отсутствует в /usr/src/linux-headers-4.15.0-43/include/, а символическая ссылка /usr/src/linux-headers-4.15.0-43/include/asm-generic на /usr/src/linux-headers-4.15.0-43/include/asm вызвала те же проблемы, что и выше.

Я знаю, в чем проблема, очевидно, что заголовочные файлы отсутствуют, но проблема в том, что я не могу их найти, где их взять? Установленные пакеты:

$ dpkg -l | grep linux-headers-
ii  linux-headers-4.15.0-23        
ii  linux-headers-4.15.0-43        
ii  linux-headers-4.15.0-43-generic
ii  linux-headers-generic          

Я перепробовал все эти, всепохоже, та же проблема.

1 Ответ

0 голосов
/ 26 января 2019

Хорошо, я нашел проблему после некоторого дальнейшего чтения благодаря Цывареву :)

Основная причина проблемы была с моим Makefile, следующее работает для меня:

obj-m += helloworld.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Это исправило исходную проблему, которая возникла у меня, появилась новая, не связанная с этой темой, но все исправлена.

...