it-swarm-eu.dev

linux/module.h: Žádný takový soubor nebo adresář

jsem začátečník a zkouším některé základy programování jádra v Linuxu. Dnes ráno jsem otevřel soubor module.h ve VIM a zavřel bez uložení jakýchkoliv změn. Po tom nejsem schopen sestavit žádný z mých kódů. Dostávám následující chybové hlášení

[[email protected] helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[[email protected] helloworld]# 

Zde je ukázkový kód, který byl úspěšně spuštěn až do posledního dne.

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

int init_module(void)
{
        printk("HELLO WORLD");
        return 0;
}

void cleanup_module(void)
{
        printk("GOODBYE");
}

Hledal jsem soubor module.h jako následující a existuje

[[email protected] usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[[email protected] usr]# 

Prosím pomozte mi. Používám CentOS ve virtuálním boxu.

14
ajishalfred

Pokoušíte se kompilovat váš modul s prostým gcc s žádným z Okolních prostředí kbuild. Možná jste s tímto přístupem dostali něco k práci v Minulosti, ale je to bolestné hrozné hrozné snažit se udržet modul Modulem používajícím cokoli jiného než čistě kbuild Makefile přístupy. Já [….] Jsem plýtval příliš mnoho svého boje proti kbuildu a nechci, aby se to stalo s vámi […]. Si přečtěte Documentation/kbuild/modules.txt před napsáním dalšího řádku kódu.

Co musíte udělat, je vytvořit Makefile pro váš modul. Jeho obsah by měl vypadat takto:

ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := modulename.o

else
# normal makefile
    KDIR ?= /lib/modules/`uname -r`/build

default:
$(MAKE) -C $(KDIR) M=$$PWD

endif

Vím, že je to mnohem složitější než většina Makefiles, které jste zvyklí vidět, , Ale slouží dvojímu účelu. Pokud v adresáři spustíte make, bude Re-invoke make používat mechanismus kbuild z aktuálně spuštěného jádra (Předpokládá se, že má alespoň symbolický odkaz z /lib/modules/.../build do správné umístění).

Opětovně vyvolaný příkaz make ($(MAKE)) bude správně sestavovat váš modul a Vám ušetří více času, než kdykoli oceníte. (Opravdu.)

Při provádění této práce udržujte Documentation/kbuild/modules.txt po vaší straně.

Poznámka: Documentation/kbuild/modules.txt může být k dispozici ve vašem systému Linux na adrese /usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt

25
sarnold

Nainstalujte balíček kernel-devel:

yum install kernel-devel

Poté byste měli mít: 

/usr/src/kernels/$kernelversion/include/linux/module.h

Pak můžete předat něco jako:

-I/usr/src/kernels/$(uname -r)/include

kompilátoru

6
duncan

Možná budete potřebovat Makefile pro kompilaci modulu. Vyzkoušeli jsme si na svém osobním počítači (Ubuntu 10.04.4), setkávám se se stejným problémem, když používám gcc -c hello.c, ale pomocí Makefile bude vše v pořádku. .32-54-obecný

0
njuzwr