2004-01-20 16:19:07

by Marcelo Tosatti

[permalink] [raw]
Subject: Re: 2.4.25pre6 and qlogic pcmcia driver



Same here, 2.4.24 does not show this behaviour.

I can't find the guilty modification in 2.4.25-pre.

On Sun, 18 Jan 2004, Arkadiusz Miskiewicz wrote:

> Hi,
>
> I was compiling 2.4.25pre6 (_but_ with bunch of different patches) with
> almost everything modular and got this:
>
> ake[1]: Wej?cie do katalogu `/home/users/misiek/rpm/BUILD/linux-2.4.24/drivers/scsi/pcmcia'
> gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogic_stub -c -o qlogic_stub.o qlogic_stub.c
> gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogicfas -DPCMCIA -D__NO_VERSION__ -c -o qlogicfas.o ../qlogicfas.c
> ../qlogicfas.c: In function `qlogicfas_detect':
> ../qlogicfas.c:650: warning: passing arg 1 of `scsi_unregister' from incompatible pointer type
> ld -m elf_i386 -r -o qlogic_cs.o qlogic_stub.o qlogicfas.o
> qlogicfas.o(.text+0xe50): In function `init_module':
> : multiple definition of `init_module'
> qlogic_stub.o(.text+0x860): first defined here
> ld: Warning: size of symbol `init_module' changed from 86 in qlogic_stub.o to 75 in qlogicfas.o
> qlogicfas.o(.text+0xea0): In function `cleanup_module':
> : multiple definition of `cleanup_module'
> qlogic_stub.o(.text+0x8c0): first defined here
> ld: Warning: size of symbol `cleanup_module' changed from 47 in qlogic_stub.o to 27 in qlogicfas.o
> make[1]: *** [qlogic_cs.o] B??d 1
>
> qlogic_cs module is going to be build using drivers/scsi/pcmcia/qlogic_stub.c
> and drivers/scsi/qlogicfas.c.


2004-01-20 18:15:39

by Randy.Dunlap

[permalink] [raw]
Subject: Re: 2.4.25pre6 and qlogic pcmcia driver

On Tue, 20 Jan 2004 14:01:54 -0200 (BRST) Marcelo Tosatti <[email protected]> wrote:

|
|
| Same here, 2.4.24 does not show this behaviour.
|
| I can't find the guilty modification in 2.4.25-pre.

Same problem with aha152x pcmcia being built as a module.

I also don't see any changes that would be causing this...

It's clear that this problem should be detected, since
scsi/qlogicfas.c and scsi/pcmcia/qlogic_stub.c both
#include <linux/init.h>, so both of them define the module
init and cleanup functions. I don't see how this worked
in the past, unless it was due to some tools that missed
detecting the duplicated functions.


| On Sun, 18 Jan 2004, Arkadiusz Miskiewicz wrote:
|
| > Hi,
| >
| > I was compiling 2.4.25pre6 (_but_ with bunch of different patches) with
| > almost everything modular and got this:
| >
| > ake[1]: Wej?cie do katalogu `/home/users/misiek/rpm/BUILD/linux-2.4.24/drivers/scsi/pcmcia'
| > gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogic_stub -c -o qlogic_stub.o qlogic_stub.c
| > gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogicfas -DPCMCIA -D__NO_VERSION__ -c -o qlogicfas.o ../qlogicfas.c
| > ../qlogicfas.c: In function `qlogicfas_detect':
| > ../qlogicfas.c:650: warning: passing arg 1 of `scsi_unregister' from incompatible pointer type
| > ld -m elf_i386 -r -o qlogic_cs.o qlogic_stub.o qlogicfas.o
| > qlogicfas.o(.text+0xe50): In function `init_module':
| > : multiple definition of `init_module'
| > qlogic_stub.o(.text+0x860): first defined here
| > ld: Warning: size of symbol `init_module' changed from 86 in qlogic_stub.o to 75 in qlogicfas.o
| > qlogicfas.o(.text+0xea0): In function `cleanup_module':
| > : multiple definition of `cleanup_module'
| > qlogic_stub.o(.text+0x8c0): first defined here
| > ld: Warning: size of symbol `cleanup_module' changed from 47 in qlogic_stub.o to 27 in qlogicfas.o
| > make[1]: *** [qlogic_cs.o] B??d 1
| >
| > qlogic_cs module is going to be build using drivers/scsi/pcmcia/qlogic_stub.c
| > and drivers/scsi/qlogicfas.c.
| -


--
~Randy
kernel-janitors project: http://janitor.kernelnewbies.org/

2004-01-21 01:33:49

by Arkadiusz Miskiewicz

[permalink] [raw]
Subject: Re: 2.4.25pre6 and qlogic pcmcia driver

Dnia wto 20. stycznia 2004 19:11, Randy.Dunlap napisa?:
> On Tue, 20 Jan 2004 14:01:54 -0200 (BRST) Marcelo Tosatti <[email protected]> wrote:
> | Same here, 2.4.24 does not show this behaviour.
> |
> | I can't find the guilty modification in 2.4.25-pre.
>
> Same problem with aha152x pcmcia being built as a module.
>
> I also don't see any changes that would be causing this...
>
> It's clear that this problem should be detected, since
> scsi/qlogicfas.c and scsi/pcmcia/qlogic_stub.c both
> #include <linux/init.h>, so both of them define the module
> init and cleanup functions. I don't see how this worked
> in the past, unless it was due to some tools that missed
> detecting the duplicated functions.
This change causes whole problem:

diff -Naur -p -X /home/marcelo/lib/dontdiff linux-2.4.24/include/linux/spinlock.h linux-2.4.25-pre6/include/linux/spinlock.h
--- linux-2.4.24/include/linux/spinlock.h 2002-11-28 23:53:15.000000000 +0000
+++ linux-2.4.25-pre6/include/linux/spinlock.h 2004-01-16 12:20:45.000000000 +0000
@@ -3,6 +3,8 @@

#include <linux/config.h>

+#include <asm/system.h>
+
/*
* These are the generic versions of the spinlocks and read-write
* locks..

The difference between 2.4.23 after preprocessing is:
static Scsi_Host_Template driver_template = { detect: qlogicfas_detect, release: qlogicfas_release, info: qlogicfas_info, co
mmand: qlogicfas_command, queuecommand: qlogicfas_queuecommand, abort: qlogicfas_abort, reset: qlogicfas_reset, bios_param:
qlogicfas_biosparam, can_queue: 0, this_id: -1, sg_tablesize: 0xff, cmd_per_lun: 1, use_clustering: 0 };
# 1 "scsi_module.c" 1
# 35 "scsi_module.c"
static int __attribute__ ((__section__ (".text.init"))) init_this_scsi_driver(void)
{
driver_template.module = (&__this_module);
scsi_register_module(1, &driver_template);
if (driver_template.present)
return 0;

scsi_unregister_module(1, &driver_template);
return -19;
}

static void __attribute__ ((unused, __section__(".text.exit"))) exit_this_scsi_driver(void)
{
scsi_unregister_module(1, &driver_template);
}

static initcall_t __initcall_init_this_scsi_driver __attribute__ ((unused,__section__ (".initcall.init"))) = init_this_scsi_
driver;;
static exitcall_t __exitcall_exit_this_scsi_driver __attribute__ ((unused,__section__ (".exitcall.exit"))) = exit_this_scsi_
driver;;

and on 2.4.25pre6:
static Scsi_Host_Template driver_template = { detect: qlogicfas_detect, release: qlogicfas_release, info: qlogicfas_info, co
mmand: qlogicfas_command, queuecommand: qlogicfas_queuecommand, abort: qlogicfas_abort, reset: qlogicfas_reset, bios_param:
qlogicfas_biosparam, can_queue: 0, this_id: -1, sg_tablesize: 0xff, cmd_per_lun: 1, use_clustering: 0 };
# 1 "scsi_module.c" 1
# 35 "scsi_module.c"
static int init_this_scsi_driver(void)
{
driver_template.module = (&__this_module);
scsi_register_module(1, &driver_template);
if (driver_template.present)
return 0;

scsi_unregister_module(1, &driver_template);
return -19;
}

static void exit_this_scsi_driver(void)
{
scsi_unregister_module(1, &driver_template);
}

int init_module(void) __attribute__((alias("init_this_scsi_driver"))); static __inline__ __attribute__((always_inline)) __at
tribute__((always_inline)) __init_module_func_t __init_module_inline(void) { return init_this_scsi_driver; };
void cleanup_module(void) __attribute__((alias("exit_this_scsi_driver"))); static __inline__ __attribute__((always_inline))
__attribute__((always_inline)) __cleanup_module_func_t __cleanup_module_inline(void) { return exit_this_scsi_driver; };
# 723 "qlogicfas.c" 2

The problem is because in 2.4.25pre6 we have
MODULE defined and
drivers/scsi/qlogicfas.c -> #include <linux/module.h>
include/linux/moduleh -> #include <linux/spinlock.h>
include/linux/spinlock.h -> #include <asm/system.h>
include/asm/system.h -> #include <linux/init.h>
as MODULE is defined then wrong functions are taken (we want these for undefined MODULE to be taken later)
then back in drivers/scsi/qlogicfas.c

#ifdef PCMCIA
#undef MODULE
#endif

and again #include <linux/init.h> this time with MODULE undefined

--
Arkadiusz Mi?kiewicz CS at FoE, Wroclaw University of Technology
arekm.pld-linux.org AM2-6BONE, 1024/3DB19BBD, arekm(at)ircnet, PLD/Linux