Kernel Module; globals badly initialized, help needed.

2 messages, 2 authors, 2002-03-28 · open the first message on its own page

Kernel Module; globals badly initialized, help needed.

From: Goddeeris Frederic <hidden>
Date: 2002-03-07 15:38:46

Hi,

I am having lots of problems with global variables that are badly
initialized in a kernel
module. I wrote some very simple code showing the problem. The compiler I
use is gcc 2.95.3
(the one that comes with HHL2.0).

Is this a compiler problem -do I need to use some special options?- or could
it
be a problem with insmod, the kernel, ...?

I had this problem before with DECLARE_WAIT_QUEUE_HEAD where the pointers
inside the structure where badly initialized. The only sollution was to
reinitialize the fields at runtime. I posted this issue and somebody
reported he had seen the same issue.

Who can help we with this?

Thanks!
Frederic


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


#if defined(CONFIG_SMP)
#define __SMP__
#endif

#if defined(CONFIG_MODVERSIONS)
#define MODVERSIONS
#include <linux/modversions.h>
#endif

char MyMemSpace[2*0x100];
char *MemPointers[2] = {&(MyMemSpace[0]), &(MyMemSpace[0x100])};

typedef struct
{
	char *szName;
	char *szName2;
} MyStruct_t;

MyStruct_t MyStruct[] = {{"A", "A2"}, {"B", "B2"}};

int init_module(void)
{
	printk("TestDriver 3 Loaded\n");

	printk("MyMemSpace: 0x%lx 0x%lx \n",  (long)&(MyMemSpace[0]),
(long)&(MyMemSpace[0x100]));
	printk("MemPointers: 0x%lx 0x%lx \n", (long)(MemPointers[0]),
(long)(MemPointers[1]));

	printk("First Char is MyStruct[0].szName %c\n",
MyStruct[0].szName[0]);


	return -1;
}

void cleanup_module(void)
{
	return;
}




This is what I get:

MyMemSpace: 0xc304a1ec 0xc304a2ec
MemPointers: 0xc304a1ec 0xc304a3ec
First Char is MyStruct[0].szName e

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: Kernel Module; globals badly initialized, help needed.

From: Paul Mackerras <hidden>
Date: 2002-03-28 00:49:37

Goddeeris Frederic writes:
I am having lots of problems with global variables that are badly
initialized in a kernel
module. I wrote some very simple code showing the problem. The compiler I
use is gcc 2.95.3
Hmmm.  I just tried your test module and it worked fine.  It produced
the following output:

TestDriver 3 Loaded
MyMemSpace: 0xd18b92a0 0xd18b93a0
MemPointers: 0xd18b92a0 0xd18b93a0
First Char is MyStruct[0].szName A

which looks fine to me.  This was with a 2.4.18 kernel.

The command line I used to compile it was:

bash-2.05a$ gcc -D__KERNEL__ -I/home/paulus/kernel/pmac-2.4.18/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -I/home/paulus/kernel/pmac-2.4.18/arch/ppc -fsigned-char -msoft-float -pipe -ffixed-r2 -Wno-uninitialized -mmultiple -mstring -DMODULE  -DKBUILD_BASENAME=modtest -c modtest.c

I got this by doing `make modules' in a kernel tree and taking the
command that it used for the first module it came across (which
happened to be serial.c) and substituting modtest for serial.

I did some minor cleanups to the code, the actual code I used is
below.

Paul.

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

char MyMemSpace[2*0x100];
char *MemPointers[2] = {&(MyMemSpace[0]), &(MyMemSpace[0x100])};

typedef struct
{
	char *szName;
	char *szName2;
} MyStruct_t;

MyStruct_t MyStruct[] = {{"A", "A2"}, {"B", "B2"}};

int init_module(void)
{
	printk("TestDriver 3 Loaded\n");

	printk("MyMemSpace: 0x%lx 0x%lx \n",  (long)&(MyMemSpace[0]),
	       (long)&(MyMemSpace[0x100]));
	printk("MemPointers: 0x%lx 0x%lx \n", (long)(MemPointers[0]),
	       (long)(MemPointers[1]));

	printk("First Char is MyStruct[0].szName %c\n",
	       MyStruct[0].szName[0]);


	return -1;
}

void cleanup_module(void)
{
	return;
}

MODULE_LICENSE("GPL");

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help