I'm at a loss to explain why I can't get this working.
I have a driver written for 2.4 that I'm porting back to 2.2. Every time I
think I got it working, something surprises me.
First, I had a bunch of link errors on the redifintion of
__module_kernel_version. To fix that, someone told me to do this:
#define __NO_VERSION__
#include <linux/version.h>
And sure enough, no more errors.
However, now I get this error from insmod when I try to load my driver:
[root@two ttabi]# insmod tdmcddk.sys
tdmcddk.sys: couldn't find the kernel version the module was compiled for
I've tried all sorts of things - recompiling the kernels, changing the order of
#include files (version.h, module.h, modversions.h, whatever). Either the
driver won't link, or it won't load.
I had our other Linux programmer (who works only with 2.2) look at the problem,
but he couldn't figure it out, either.
I'd be very appreciative of any assistance.
--
Timur Tabi - [email protected]
Interactive Silicon - http://www.interactivesi.com
When replying to a mailing-list message, please direct the reply to the mailing list only. Don't send another copy to me.
If my understanding is correct, you need to include version.h without
"#define __NO_VERSION__" in one and only one of your module's .c files.
More than one, and you get redefinition errors; less than one, and its
undefined.
On Tue, Nov 14, 2000 at 03:58:38PM -0600, Timur Tabi wrote:
> I'm at a loss to explain why I can't get this working.
>
> I have a driver written for 2.4 that I'm porting back to 2.2. Every time I
> think I got it working, something surprises me.
>
> First, I had a bunch of link errors on the redifintion of
> __module_kernel_version. To fix that, someone told me to do this:
>
> #define __NO_VERSION__
> #include <linux/version.h>
>
> And sure enough, no more errors.
>
> However, now I get this error from insmod when I try to load my driver:
>
> [root@two ttabi]# insmod tdmcddk.sys
> tdmcddk.sys: couldn't find the kernel version the module was compiled for
>
> I've tried all sorts of things - recompiling the kernels, changing the order of
> #include files (version.h, module.h, modversions.h, whatever). Either the
> driver won't link, or it won't load.
>
> I had our other Linux programmer (who works only with 2.2) look at the problem,
> but he couldn't figure it out, either.
>
> I'd be very appreciative of any assistance.
>
** Reply to message from Steven Walter <[email protected]> on Tue,
14 Nov 2000 16:31:54 -0600
> If my understanding is correct, you need to include version.h without
> "#define __NO_VERSION__" in one and only one of your module's .c files.
> More than one, and you get redefinition errors; less than one, and its
> undefined.
I tried that, and it didn't help.
--
Timur Tabi - [email protected]
Interactive Silicon - http://www.interactivesi.com
When replying to a mailing-list message, please direct the reply to the mailing list only. Don't send another copy to me.
On Tue, 14 Nov 2000 15:58:38 -0600,
Timur Tabi <[email protected]> wrote:
>First, I had a bunch of link errors on the redifintion of
>__module_kernel_version. To fix that, someone told me to do this:
>
>#define __NO_VERSION__
>#include <linux/version.h>
"#define __NO_VERSION__" must be in all but one of the sources that
also include module.h. It suppresses the module_version string in
module.h so it only make sense if the code includes module.h. But
exactly one of the objects in a module must have a module_version
string.
** Reply to message from Keith Owens <[email protected]> on Wed, 15 Nov 2000
10:31:22 +1100
> "#define __NO_VERSION__" must be in all but one of the sources that
> also include module.h. It suppresses the module_version string in
> module.h so it only make sense if the code includes module.h. But
> exactly one of the objects in a module must have a module_version
> string.
Ok, I made this change:
#ifndef __ENTRY_C__
#define __NO_VERSION__
#endif
#include <linux/version.h>
and in entry.c:
#define __ENTRY_C__
#include "include.h"
Unfortunately, it still doesn't work.
I tried "insmod -f tdmcddk.sys", but that didn't help either.
--
Timur Tabi - [email protected]
Interactive Silicon - http://www.interactivesi.com
When replying to a mailing-list message, please direct the reply to the mailing list only. Don't send another copy to me.
On Tue, 14 Nov 2000 17:35:37 -0600,
Timur Tabi <[email protected]> wrote:
>Ok, I made this change:
>
>#ifndef __ENTRY_C__
>#define __NO_VERSION__
>#endif
>#include <linux/version.h>
>
>and in entry.c:
>
>#define __ENTRY_C__
>#include "include.h"
>
>Unfortunately, it still doesn't work.
__NO_VERSION__ must be defined before #include <module.h>. Do it by hand.
** Reply to message from Keith Owens <[email protected]> on Wed, 15 Nov 2000
10:41:42 +1100
> __NO_VERSION__ must be defined before #include <module.h>.
It is:
#ifdef LINUX
#ifndef __ENTRY_C__
#define __NO_VERSION__
#endif
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
>Do it by hand.
I don't know what you mean by that.
--
Timur Tabi - [email protected]
Interactive Silicon - http://www.interactivesi.com
When replying to a mailing-list message, please direct the reply to the mailing list only. Don't send another copy to me.
On Tue, Nov 14, 2000 at 05:44:42PM -0600, Timur Tabi wrote:
> ** Reply to message from Keith Owens <[email protected]> on Wed, 15 Nov 2000
> 10:41:42 +1100
>
>
> > __NO_VERSION__ must be defined before #include <module.h>.
>
> It is:
>
> #ifdef LINUX
> #ifndef __ENTRY_C__
> #define __NO_VERSION__
> #endif
> #include <linux/version.h>
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/types.h>
>
> >Do it by hand.
>
> I don't know what you mean by that.
>
Module source should look like this:
single .c -> single .o
#include <linux/kernel.h>
#include <linux/module.h>
multiple .c -> single .o, main .c file (contains init_module(), etc.)
#include <linux/kernel.h>
#include <linux/module.h>
multiple .c -> single .o, secondary .c file
#include <linux/kernel.h>
multiple .c -> single .o, secondary .c file that requires module.h
for a particular purpose, such as EXPORT_SYMBOL()
#define __NO_VERSION__
#include <linux/kernel.h>
#include <linux/module.h>
Note that in most cases, you _don't_ need to include module.h.
Your Makefile should call gcc with '-D__KERNEL__ -DMODULE', as well
as other approprate flags.
dave...