2005-09-19 10:29:33

by Ustyugov Roman

[permalink] [raw]
Subject: [BUG] module-init-tools

Hello!

I found a bug in module-init-tools.

'lsmod' shows a wrong module name, when module name complied with some
"define" at one of kernel header files.

For example,

File "current.c"
=======================
#include <linux/kernel.h>
#include <linux/module.h>

int init_module(void) {

? ? return 0;
}

void cleanup_module() {
}

MODULE_LICENSE("GPL");
=======================

Makefile:

=======================
obj-m ? += current.o
=======================

Make this module and type commands:

insmod current.ko
lsmod

And we can see:

Module ? ? ? ? ? ? ? ? ?Size ?Used by
get_current() ? ? ? ? ? 1152 ?0 ? ? ? ? ? ? <---- Oops, ?must be 'current'
smbfs ? ? ? ? ? ? ? ? ?61432 ?2
hfsplus ? ? ? ? ? ? ? ?56708 ?0
nls_cp866 ? ? ? ? ? ? ? 5120 ?1
nls_iso8859_1 ? ? ? ? ? 4096 ?0
nls_cp437 ? ? ? ? ? ? ? 5760 ?0
vfat ? ? ? ? ? ? ? ? ? 12800 ?0
fat ? ? ? ? ? ? ? ? ? ?37916 ?1 vfat
nls_utf8 ? ? ? ? ? ? ? ?2048 ?1
? ? ? ? ? ?.....

File <asm/current.h>:

===================
? ? ? ? ? ...
#define ? ?current ? ?get_current()
? ? ? ? ? ...
===================

Try to remove module:

romanu:/current # rmmod current
ERROR: Module current does not exist in /proc/modules
romanu:/current # rmmod -v "get_current()"
rmmod get_current(), wait=no
romanu:/current #

I can't remove module with 'rmmod current',
but can with
????????rmmod "get_current()"

Is it a bug?

Then, next example.

File 'init_stack.c'
=================
#include <linux/kernel.h>
#include <linux/module.h>

int init_module(void) {

? ? return 0;
}

void cleanup_module() {
}

MODULE_LICENSE("GPL");
=================

Make and insert module 'init_stack.ko':

lsmod:

Module ? ? ? ? ? ? ? ? ?Size ?Used by
get_current() ? ? ? ? ? 1152 ?0
(init_thread_union.stack) ? ? 1152 ?0 ? ?<---- Oops, ?must be 'init_stack'
smbfs ? ? ? ? ? ? ? ? ?61432 ?2
hfsplus ? ? ? ? ? ? ? ?56708 ?0
nls_cp866 ? ? ? ? ? ? ? 5120 ?1
nls_iso8859_1 ? ? ? ? ? 4096 ?0

Now I can't to remove it at all ! :(:(

>From <asm/thread_info.h>

====================
????????...
#define init_stack ? ? ? ? ? ? ?(init_thread_union.stack)
????????...
====================

Some information about software:

OS: SuSE Pro 9.3
kernel version: ?2.6.11.4-21.8-default
module-init-tools version: 3.2_pre1-7

--
WBR, Roman.


2005-09-19 11:30:22

by Coywolf Qi Hunt

[permalink] [raw]
Subject: Re: [BUG] module-init-tools

On 9/19/05, Ustyugov Roman <[email protected]> wrote:
> Hello!
>
> I found a bug in module-init-tools.
>
> 'lsmod' shows a wrong module name, when module name complied with some
> "define" at one of kernel header files.
>
> For example,
>
> File "current.c"
> =======================
> #include <linux/kernel.h>
> #include <linux/module.h>
>
> int init_module(void) {
>
> return 0;
> }
>
> void cleanup_module() {
> }
>
> MODULE_LICENSE("GPL");
> =======================
>
> Makefile:
>
> =======================
> obj-m += current.o
> =======================
>
> Make this module and type commands:
>
> insmod current.ko
> lsmod
>
> And we can see:
>
> Module Size Used by
> get_current() 1152 0 <---- Oops, must be 'current'
> smbfs 61432 2
> hfsplus 56708 0
> nls_cp866 5120 1
> nls_iso8859_1 4096 0
> nls_cp437 5760 0
> vfat 12800 0
> fat 37916 1 vfat
> nls_utf8 2048 1
> .....
>
> File <asm/current.h>:
>
> ===================
> ...
> #define current get_current()
> ...
> ===================
>
> Try to remove module:
>
> romanu:/current # rmmod current
> ERROR: Module current does not exist in /proc/modules
> romanu:/current # rmmod -v "get_current()"
> rmmod get_current(), wait=no
> romanu:/current #
>
> I can't remove module with 'rmmod current',
> but can with
> rmmod "get_current()"
>
> Is it a bug?

Yes, it's a bug. But it's a bad idea too to use well known kernel
symbols as module names.
--
Coywolf Qi Hunt
http://sosdg.org/~coywolf/

2005-09-19 11:50:59

by Ustyugov Roman

[permalink] [raw]
Subject: Re: [BUG] module-init-tools

On 9/19/05 Coywolf Qi Hunt wrote:
> Yes, it's a bug. But it's a bad idea too to use well known kernel
> symbols as module names.

Sure. Please, add to module documentation:

To make unique name of module use command:

touch `cat /dev/urandom | uuencode -m - | head -n 2 | tail -c10`.c

;-)

--
RomanU

2005-09-19 13:21:42

by Coywolf Qi Hunt

[permalink] [raw]
Subject: Re: [BUG] module-init-tools

On 9/19/05, Ustyugov Roman <[email protected]> wrote:
> Hello!
>
> I found a bug in module-init-tools.
>
> 'lsmod' shows a wrong module name, when module name complied with some
> "define" at one of kernel header files.
>
> For example,
>
> File "current.c"
> =======================
> #include <linux/kernel.h>
> #include <linux/module.h>
>
> int init_module(void) {
>
> return 0;
> }
>
> void cleanup_module() {
> }
>
> MODULE_LICENSE("GPL");
> =======================
>
> Makefile:
>
> =======================
> obj-m += current.o
> =======================
>
> Make this module and type commands:
>
> insmod current.ko
> lsmod
>
> And we can see:
>
> Module Size Used by
> get_current() 1152 0 <---- Oops, must be 'current'
> smbfs 61432 2
> hfsplus 56708 0
> nls_cp866 5120 1
> nls_iso8859_1 4096 0
> nls_cp437 5760 0
> vfat 12800 0
> fat 37916 1 vfat
> nls_utf8 2048 1
> .....
>
> File <asm/current.h>:
>
> ===================
> ...
> #define current get_current()
> ...
> ===================
>
> Try to remove module:
>
> romanu:/current # rmmod current
> ERROR: Module current does not exist in /proc/modules
> romanu:/current # rmmod -v "get_current()"
> rmmod get_current(), wait=no
> romanu:/current #
>
> I can't remove module with 'rmmod current',
> but can with
> rmmod "get_current()"
>
> Is it a bug?
>
> Then, next example.
>
> File 'init_stack.c'
> =================
> #include <linux/kernel.h>
> #include <linux/module.h>
>
> int init_module(void) {
>
> return 0;
> }
>
> void cleanup_module() {
> }
>
> MODULE_LICENSE("GPL");
> =================
>
> Make and insert module 'init_stack.ko':
>
> lsmod:
>
> Module Size Used by
> get_current() 1152 0
> (init_thread_union.stack) 1152 0 <---- Oops, must be 'init_stack'
> smbfs 61432 2
> hfsplus 56708 0
> nls_cp866 5120 1
> nls_iso8859_1 4096 0
>
> Now I can't to remove it at all ! :(:(
>
> From <asm/thread_info.h>
>
> ====================
> ...
> #define init_stack (init_thread_union.stack)
> ...
> ====================
>
> Some information about software:
>
> OS: SuSE Pro 9.3
> kernel version: 2.6.11.4-21.8-default
> module-init-tools version: 3.2_pre1-7

Actually, this is a kbuild bug, not module-init-tools' fault.

(cc Sam)

--
Coywolf Qi Hunt
http://sosdg.org/~coywolf/

2005-09-20 07:20:58

by Ustyugov Roman

[permalink] [raw]
Subject: Re: [BUG] module-init-tools

Thayumanavar Sachithanantham wrote:
> > buf_printf(b, " .name = __stringify(KBUILD_MODNAME),\n");
>
> $(modname))),-DKBUILD_MODNAME=$(subst $(comma),_,$(subst -,_,$(modname))))
>

In my case I've already had these lines at files you're specified.
But situation is unchanged. Module name is wrong :(
Any ideas?

--
RomanU

Subject: Re: [BUG] module-init-tools

Please change the lines that you have mentioned to this:

buf_printf(b, " .name = KBUILD_MODNAME,\n");
modname_flags = $(if $(filter 1,$(words $(modname))),-D'DUM(a)=\#a'
-D'KBUILD_MODNAME=DUM($(subst $(comma),_,$(subst -,_,$(modname))))')

Let me know your results.Take care of the quotes while you change.

Thayumanavar

2005-09-20 08:09:57

by Ustyugov Roman

[permalink] [raw]
Subject: Re: [BUG] kbuild

Thayumanavar Sachithanantham wrote:
> Let me know your results.Take care of the quotes while you change.

make -C ../../../linux-2.6.11.4-21.8
O=../linux-2.6.11.4-21.8-obj/i386/default /bin/sh: -c: line 0: syntax error
near unexpected token `('
/bin/sh: -c: line 0: `set -e;
.....

What symbol must be between
-D'DUM(a)=\#a'
and
-D'KBUILD_MODNAME=DUM($(subst $(comma),_,$(subst -,_,$(modname))))')

?

I tried a space, comma and no spaces, also with quotes and without any, but
got an error above.

Here is my line:
modname_flags = $(if $(filter 1,$(words $(modname))),-D'DUM(a)=\#a'
-D'KBUILD_MODNAME=DUM($(subst $(comma),_,$(subst -,_,$(modname))))')

--
RomanU

Subject: Re: [BUG] kbuild

On 9/20/05, Ustyugov Roman <[email protected]> wrote:
> Thayumanavar Sachithanantham wrote:
> > Let me know your results.Take care of the quotes while you change.
>
> make -C ../../../linux-2.6.11.4-21.8
> O=../linux-2.6.11.4-21.8-obj/i386/default /bin/sh: -c: line 0: syntax error
> near unexpected token `('
> /bin/sh: -c: line 0: `set -e;
> .....
>
> What symbol must be between
> -D'DUM(a)=\#a'
> and
> -D'KBUILD_MODNAME=DUM($(subst $(comma),_,$(subst -,_,$(modname))))')
>
> ?
>
> I tried a space, comma and no spaces, also with quotes and without any, but
> got an error above.
>
> Here is my line:
> modname_flags = $(if $(filter 1,$(words $(modname))),-D'DUM(a)=\#a'
> -D'KBUILD_MODNAME=DUM($(subst $(comma),_,$(subst -,_,$(modname))))')
>
> --
> RomanU
>

A space.
Let me know if you still get errors. Also there should be an extra
parantheses before the quote.

Thayumanavar S.

2005-09-20 09:28:49

by Ustyugov Roman

[permalink] [raw]
Subject: [PATCH] kbuild: using well known kernel symbols as module names.


Here is a Thayumanavar's ([email protected]) patch with small changes. I have
to use double quotes, but not single ones.
Problem was solved.

--- linux/scripts/Makefile.lib.orig 2005-03-02 10:38:09.000000000 +0300
+++ linux/scripts/Makefile.lib 2005-09-20 13:14:13.000000000 +0400
@@ -96,7 +96,7 @@ depfile = $(subst $(comma),_,$(@D)/.$(@F
# than one module. In that case KBUILD_MODNAME will be set to foo_bar,
# where foo and bar are the name of the modules.
basename_flags = -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F)))
-modname_flags = $(if $(filter 1,$(words
$(modname))),-DKBUILD_MODNAME=$(subst $(comma),_,$(subst -,_,$(modname))))
+modname_flags = $(if $(filter 1,$(words $(modname))),-D"DUM(a)=\#a"
-D"KBUILD_MODNAME=DUM($(subst $(comma),_,$(subst -,_,$(modname))))")

_c_flags = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o)
_a_flags = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o)
--- linux/scripts/mod/modpost.c.orig 2005-07-23 04:41:06.000000000 +0400
+++ linux/scripts/mod/modpost.c 2005-09-20 13:19:21.000000000 +0400
@@ -575,7 +575,7 @@ add_header(struct buffer *b, struct modu
buf_printf(b, "#undef unix\n"); /* We have a module called "unix" */
buf_printf(b, "struct module __this_module\n");
buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) =
{\n");
- buf_printf(b, " .name = __stringify(KBUILD_MODNAME),\n");
+ buf_printf(b, " .name = KBUILD_MODNAME,\n");
if (mod->has_init)
buf_printf(b, " .init = init_module,\n");
if (mod->has_cleanup)

--
RomanU

Subject: Re: [PATCH] kbuild: using well known kernel symbols as module names.

For me it works with single quotes. Anyhow it's okay. Thanks.

Regards,
Thayumanavar S.