module compiling : asm/linkage.h file not found

后端 未结 5 1508
别跟我提以往
别跟我提以往 2021-01-01 19:18

I am trying to compile an example of \"hello world\" Kernel Module, problems found on ubuntu 11.04, kernel 3.2.6, gcc 4.5.2 and fedora 16, kernel 3.2.7, gcc 4.6.7.

c

相关标签:
5条回答
  • 2021-01-01 19:38

    asm should be a link to the actual architecture you're compiling for, not to asm-generic.
    You can't compile a generic kernel module, that would work on a generic architecture. You have to compile it for the particular architecture you're going to use.

    I don't know why the asm didn't exist. It should be created as part of the configuration process.
    You might get other errors later, if configuration is incomplete in other ways.

    0 讨论(0)
  • 2021-01-01 19:38

    The asm includes (such as linkage.h) are architecture specific. There should be a set of directories under:

        /usr/src/kernels/(kernel version goes here)/arch
    

    that provide specific includes for the specific CPU architecture you are targeting your code to be compiled for.

    Try adding this to your Makefile:

        KVERSION :=R(shell uname -r)
    

    and add the kernel and architecture (x86 in this example):

        INCDIRS = -I./include -I/usr/src/kernels/$(KVERSION)/include -I/usr/src/kernels/$(KVERSION)/arch/x86
    
    0 讨论(0)
  • 2021-01-01 19:46

    module compiling : asm/linkage.h file not found

    This means this particular file was not found in specified DIR, which gets specified when we use -I option with make.

    We can either link that asm-generic to asm, if all headers are present in asm-generic, or we can use make utility.

    Make utility is preferred in case of building kernel modules.

    Create a 'Makefile' in working DIR.

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

    Use of -C option will change to DIR specified before reading the makefiles or doing anything else.

    So to avoid this error, use -C option with DIR/lib/modules/$(shell uname -r)/build

    By this your program will be able to find required files, you will get hello.ko file.

    You can add this to kernel modules by

    sudo insmod hello.ko
    

    Similarly you can remove by

    sudo rmmod hello
    
    0 讨论(0)
  • 2021-01-01 19:48
    obj-m += hello.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
    

    is a proper way to build modules see kbuild documentation

    And to see difference beetween your compiler invocation you could

    cat /lib/modules/$(shell uname -r)/build/Makefile
    

    And analyze an output

    0 讨论(0)
  • 2021-01-01 19:53
    obj-m += hello.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
    

    Here hello.c is your kernel source file. just use make to build your hello.ko module.

    0 讨论(0)
提交回复
热议问题