Robert Crawford
Robert Crawford

Reputation: 215

linux/init.h: No such file or directory

I'm trying to build a kernel module for my class, and I'm getting a massive wall of errors, but at the top of said wall is the infamous 'No such file or directory' error. It seems to be the root of the problem. This not only seems to affect init.h, but also module.h and kernel.h. The first three lines of the program go as follows:

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

I've looked around and tried other paths for where these files ought to be when browsing similar issues, but nothing has worked thus far. The strangest part is that I used this module already; I was provided starter code that had this at the top (I didn't change anything) and it didn't give me that error. Although, obviously the code after is different, but this seems to be the biggest problem at the moment.

The full code is as follows:

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

/* This function is called when the module is loaded. */
int simple_init(void)
{
    printk(KERN_INFO "Loading Module\n");
    static LIST_HEAD(birthday_list)
    struct birthday{
        int day;
        int month;
        int year;
        struct list_head list;
    };
    struct birthday *ptr, *next;
    struct birthday *bob;
    struct birthday *judy;
    struct birthday *josh;
    struct birthday *lana;
    struct birthday *jan;

    bob = kmalloc(sizeof(*bob), GFP_KERNEL);
    bob -> day = 17;
    bob -> month = 1;
    bob -> year = 1990;
    INIT_LIST_HEAD(&bob -> list);

    ...

    list_add_tail(bob -> list, &birthday_list);
    list_add_tail(judy -> list, &birthday_list);
    list_add_tail(josh -> list, &birthday_list);
    list_add_tail(lana -> list, &birthday_list);
    list_add_tail(jan -> list, &birthday_list);

    struct birthday *ptr;

    list_for_each_entry(ptr, &birthday_list, list){

        kprintf('%d/%d/%d \n', ptr -> month, ptr -> day,  ptr -> year);
    }

    list_for_each_entry_safe(ptr, &birthday_list, list){

        list_del(&ptr->list);
        kfree(ptr);
    }

       return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    printk(KERN_INFO "Removing Module\n");
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");

Upvotes: 17

Views: 68266

Answers (4)

Yanjan. Kaf.
Yanjan. Kaf.

Reputation: 1755

As some comment mentioned, that you neet to install these headers, later on, they ( distro maintainers) dont ship the OS with the driver headers because not everyone using Ubunutu or any distro will end up creating drivers.

So if anyone is using ubuntu and facing same issue as mentioned above you neet to install the generic-headers by

sudo apt install linux-headers-generic

and if you are using something like arch or something, look for how to install kernel development headers, now it might work for you by just putting, if not try restarting your system.

#include <init.h>
#include <module.h>

If still not working you need to find other way around and leave the compilation of the file to makefile so install the make first

sudo apt install make

create a make file and add following lines to it —

obj-m += foo.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

For more visit — https://www.linuxquestions.org/questions/programming-9/linux-module-h-915605/

Upvotes: 3

izak
izak

Reputation: 51

When building kernel modules you should use Makefiles:

obj-m := module_name.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

all default: modules
install: modules_install

modules modules_install help clean:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) $@

Upvotes: 5

GEphil
GEphil

Reputation: 11

There's a typo in the first line of the full code "/usr/unclude..." that could be responsible for failure to find init.h

Upvotes: 1

Parham Alvani
Parham Alvani

Reputation: 2440

I think you must first install something like linux-headers-[kernel version] by apt-get then you must create Makefile as following :

ifneq ($(KERNELRELEASE),)
    # call from kernel build system
    lifo-objs := main.o
    obj-m   := lifo.o
else
   KERNELDIR ?= /lib/modules/$(shell uname -r)/build
   PWD       := $(shell pwd)
modules:
    echo $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
    $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
endif

clean:  
    rm -rf *.o *~ core .depend *.mod.o .*.cmd *.ko *.mod.c \
    .tmp_versions *.markers *.symvers modules.order

depend .depend dep:
    $(CC) $(CFLAGS) -M *.c > .depend

ifeq (.depend,$(wildcard .depend))
    include .depend
endif

set KERNELDIR variable in above Makefile to your appropriate kernel version, by default it use your running kernel. If you use this Makefile you need to change your include to following format:

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

I think for kernel module developing use standard kernel from Linus Torvalds git is better. For some simple kernel module see this.

Upvotes: 9

Related Questions