RE: Problem in Compiling Kernel Module

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





 
Thanks for suggestions.
Now, I am able to get the module compiled properly without any error.
 
I know there were few problems like i used different return types for write and read file operation functions. I did that as earlier compiler was not even recognizing user defined types like ssize_t and loff_t etc, so i placed so i placed standard type int.
 
I think the main problem was that I was not mentioning the Include path option to gcc. I have one question on this, why we need to specify the path of include folder, there must be default with gcc settings. Whats the default include path for gcc compiler, i know it will not be in any case the path to include folder in kernel source, because kernel programming is not what gcc is normally made for. 
>Normally , a program is linked with gcc library files to provide definitions of the functions which are used in the program , so we dont specify any path to the gcc
> but you dont use gcc libraries for kernel for obvious reasons, so you need to specify the path of the definitions of the functions used by your kernel.
 
 
Anyway thanks for helping me out. It was my first experinece on this list and definitely a good one.
 
GD.


suneesh <suneesh@naturesoft.net> wrote:
Hi

From the compilation error, it is sure that you are not including
kernel headers while
compiling. Use -I$(KERNELDIR)/include while compilation or use the makefile
attached ( Modify the KERNELDIR according to yours ). There are some
more errors
in your code, solve it afterwards...

Regards

Suneesh


Gaurav Dhiman wrote:

> Hi
>
> I am a Newbie in Kernel Programming and just now subscribed to this
> list. Writing my first kernel module and reading Alessandro's book on
> Linux Device Driver.
>
> When I compile my simple module with gcc, it throughs al bunch of errors.
>
> As far as I think the errors are because the gcc could not find the
> defination of few of the structure used, like struct file, struct
> inode and struct file_operations etc. I have included the linux/fs.h
> file and have also define the required macros like MODULE and
> __KERNEL__, but still not able to compile it successfully.
>
> For debugging, I ran the macro option (-E) of gcc to get the output of
> Macro, so that I could know what exactly is included in file before
> compilation. In the Macro output I could not find the definations of
> above mentioned structure, although they are defined in linux/fs.h and
> I have included that file in my source.
>
> I am pasting the output of gcc below.
>
> Also pasting the source of my module.
>
> Please have a look at it and help me if you can.
>
> In source I have left few of the functions like open, release etc,
> blank. I have just started writing it and will complete it once I get
> through this problem.
>
> Details of my system:
>
> Single Processor
>
> Redhat Enterprise 3.1
>
> Kernel: linux-2.4.21-4
>
> Compiler : gcc 3.2.3.20
>
> I have one more this to say, when I cteared the simple "Hello World"
> module and compiled it, it compiled without any problem, but when I
> tried to load that module in kernel, insmod command gave me versioning
> error. It said that you are trying to load the module against
> different kernel version. Well I know it can happen, but my question
> on this is, is it possible that the runnning kernel might be different
> from the kernel in source tree. I did not downloaded the source, It's
> the default source which comes with installation.
>
> Anyway, please take a look at the errors and source to help me out.
>
> ************************************************************************************************
>
> Output of gcc
>
> ************************************************************************************************
>
> main.c:27: warning: `struct file' declared inside parameter list
>
> main.c:27: warning: its scope is only this definition or declaration,
> which is probably not what you want
>
> main.c:27: warning: `struct inode' declared inside parameter list
>
> main.c:28: warning: `struct file' declared inside parameter list
>
> main.c:29: warning: `struct file' declared inside parameter list
>
> main.c:30: warning: `struct file' declared inside parameter list
>
> main.c:31: warning: `struct file' declared inside parameter list
>
> main.c:31: warning: `struct inode' declared inside parameter list
>
> main.c: In function `fifo_init_module':
>
> main.c:71: invalid use of undefined type `struct file_operations'
>
> main.c:72: invalid use of undefined type `struct file_operations'
>
> main.c:73: invalid use of undefined type `struct file_operations'
>
> main.c:73: `write' undeclared (first use in this function)
>
> main.c:73: (Each undeclared identifier is reported only once
>
> main.c:73: for each function it appears in.)
>
> main.c:74: invalid use of undefined type `struct file_operations'
>
> main.c:75: invalid use of undefined type `struct file_operations'
>
> main.c:77: warning: implicit declaration of function `register_chrdev'
>
> main.c:80: warning: implicit declaration of function `printk'
>
> main.c:80: `KERN_EMERG' undeclared (first use in this function)
>
> main.c:80: syntax error before string constant
>
> main.c: In function `fifo_cleanup_module':
>
> main.c:101: warning: implicit declaration of function `unregister_chrdev'
>
> main.c:101: `fifo_f_ops' has an incomplete type
>
> main.c: At top level:
>
> main.c:122: warning: `struct file' declared inside parameter list
>
> main.c:122: warning: `struct inode' declared inside parameter list
>
> main.c:122: conflicting types for `fifo_open'
>
> main.c:27: previous declaration of `fifo_open'
>
> main.c:140: warning: `struct file' declared inside parameter list
>
> main.c:140: conflicting types for `fifo_read'
>
> main.c:28: previous declaration of `fifo_read'
>
> main.c:160: warning: `struct file' declared inside parameter list
>
> main.c:160: conflicting types for `fifo_write'
>
> main.c:29: previous declaration of `fifo_write'
>
> main.c:175: warning: `struct file' declared inside parameter list
>
> main.c:175: conflicting types for `fifo_llseek'
>
> main.c:30: previous declaration of `fifo_llseek'
>
> main.c:194: warning: `struct file' declared inside parameter list
>
> main.c:194: warning: `struct inode' declared inside parameter list
>
> main.c:194: conflicting types for `fifo_release'
>
> main.c:31: previous declaration of `fifo_release'
>
> main.c:203: warning: type defaults to `int' in declaration of
> `module_init'
>
> main.c:203: warning: parameter names (without types) in function
> declaration
>
> main.c:203: warning: data definition has no type or storage class
>
> main.c:204: warning: type defaults to `int' in declaration of
> `module_exit'
>
> main.c:204: warning: parameter names (without types) in function
> declaration
>
> main.c:204: warning: data definition has no type or storage class
>
> main.c:44: storage size of `fifo_f_ops' isn't known
>
> ************************************************************************************************
>
> Main.c
>
> ************************************************************************************************
>
> /*Simple FIFO Module*/
>
> #define MODULE
>
> #define __KERNEL__
>
> #include
>
> #ifdef CONFIG_SMP
>
> #define __SMP__
>
> #endif
>
> #include
>
> #include
>
> #include
>
> #include
>
> #include
>
> /*#include*/
>
> /*#include*/
>
> #define MAJOR_NUM 0
>
> #define DRIVER_NAME "my_fifo"
>
> /*========================================
>
> Function Declerations
>
> =========================================*/
>
> int fifo_init_module(void);
>
> void fifo_cleanup_module(void);
>
> int fifo_open(struct inode* fifo_inode_p, struct file* fifo_file_p);
>
> int fifo_read(struct file* fifo_file_p, char* fifo_read_buffer, int
> fifo_num_char, loff_t* fifo_file_position_p);
>
> size_t fifo_write(struct file* fifo_file_p, char* fifo_write_buffer,
> size_t fifo_num_char, loff_t* fifo_file_position_p);
>
> int fifo_llseek(struct file* fifo_file_p, loff_t fifo_file_position);
>
> int fifo_release(struct inode* fifo_inode_p, struct file* fifo_file_p);
>
> /*========================================
>
> Global Declerations
>
> =========================================*/
>
> /*struct file_operations fifo_f_ops = {
>
> llseek: fifo_lseek,
>
> read: fifo_read,
>
> write: fifo_write,
>
> open: fifo_open
>
> };*/
>
> struct file_operations fifo_f_ops;
>
> /*this flag will be used for tracking and reverting back
>
> in initialization phase, in case some thing goes wrong in initilizing
> module*/
>
> int fifo_init_flag = 0;
>
> int fifo_major_num = MAJOR_NUM;
>
> MODULE_PARM(fifo_major_num, "i");
>
> /*========================================
>
> Functions Defination
>
> =========================================*/
>
> /*====================================================================
>
> Name: fifo_init_module()
>
> =====================================================================*/
>
> int fifo_init_module(void){
>
> int retval = 0;
>
> fifo_f_ops.llseek = fifo_llseek;
>
> fifo_f_ops.read = fifo_read;
>
> fifo_f_ops.write = write;
>
> fifo_f_ops.open = fifo_open;
>
> fifo_f_ops.release = fifo_release;
>
> retval = register_chrdev(fifo_major_num, DRIVER_NAME, &fifo_f_ops);
>
> if (retval < 0){
>
> printk(KERN_EMERG "fifo driver could not get the free major number.\n");
>
> return retval;
>
> }
>
> fifo_major_num = fifo_major_num?fifo_major_num:retval;
>
> fifo_init_flag = 1;
>
> }
>
> /*====================================================================
>
> Name: fifo_clear_module()
>
> =====================================================================*/
>
> void fifo_cleanup_module(void){
>
> switch(fifo_init_flag){
>
> case 1:
>
> unregister_chrdev(DRIVER_NAME, fifo_f_ops);
>
> break;
>
> };
>
> }
>
> /*====================================================================
>
> Name: fifo_open()
>
> =====================================================================*/
>
> int fifo_open(struct inode* fifo_inode_p, struct file* fifo_file_p){
>
> }
>
> /*====================================================================
>
> Name: fifo_read()
>
> =====================================================================*/
>
> int fifo_read(struct file* fifo_file_p, char* fifo_read_buffer, int
> fifo_num_char, loff_t* fifo_file_position_p){
>
> }
>
> /*====================================================================
>
> Name: fifo_write()
>
> =====================================================================*/
>
> size_t fifo_write(struct file* fifo_file_p, char* fifo_write_buffer,
> size_t fifo_num_char, loff_t* fifo_file_position_p){
>
> }
>
> /*====================================================================
>
> Name: fifo_lseek()
>
> =====================================================================*/
>
> int fifo_llseek(struct file* fifo_file_p, loff_t fifo_file_position){
>
> }
>
> /*====================================================================
>
> Name: fifo_release()
>
> =====================================================================*/
>
> int fifo_release(struct inode* fifo_inode_p, struct file* fifo_file_p){
>
> }
>
> /*====================================================================
>
> Explicitly mentioning the initialization and cleanup function of this
>
> driver module.
>
> =====================================================================*/
>
> module_init(fifo_init_module);
>
> module_exit(fifo_cleanup_module);
>
> Regards,
>
> Gaurav
>
> ------------------------------------------------------------------------
> Do you Yahoo!?
> Yahoo! Mail
> <
> - 50x more storage than other providers!


KERNELDIR = /usr/src/linux-2.4

include $(KERNELDIR)/.config

CFLAGS = -I$(KERNELDIR)/include -DEXPORT_SYMTAB \
-O -Wall

ifdef CONFIG_SMP
CFLAGS += -DSMP
endif

all: main.o

clean:
rm -f *.o *~ core


Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!



Disclaimer:


This message and any attachment(s) contained here are information that is confidential,proprietary to HCL Technologies and its customers, privileged or otherwise protected by law.The information is solely intended for the individual or the entity it is addressed to. If you are not the intended recipient of this message, you are not authorized to read, forward, print,retain, copy or disseminate this message or any part of it. If you have received this e-mail in error, please notify the sender immediately by return e-mail and delete it from your computer.




[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux