Chyba v gcc-2.96-129.7.2 (RHEL 3.0 upd), gcc-2.96-110 (RH 7.3) atd.?

Ing. Pavel PaJaSoft Janoušek PaJaSoft na FoNet.Cz
Středa Leden 5 11:10:09 CET 2005


	Narazil jsem při kompilaci kernelu na podivnost...

V drivers/scsi/sd.c je funkce static int sd_open(struct inode *inode, struct
file *filp)

Obvyklý obsah je následující:

{
        int target, retval = -ENXIO;
        Scsi_Device * SDev;
        target = DEVICE_NR(inode->i_rdev);
        struct request_queue *q;

        SCSI_LOG_HLQUEUE(1, printk("target=%d, max=%d\n", target,
sd_template.dev_max));
.
.

Při kompilaci kernelu gcc řve:

gcc -D__KERNEL__ -I/usr/src/redhat/BUILD/kernel-2.4.21/linux-2.4.21/include
-Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing
-fno-common  -Wno-unused -fomit-frame-pointer -pipe -freorder-blocks
-mpreferred-stack-boundary=2 -march=i686   -nostdinc -iwithprefix include
-DKBUILD_BASENAME=sd  -DEXPORT_SYMTAB -c sd.c
sd.c: In function `sd_open':
sd.c:489: parse error before `struct'
sd.c:518: `q' undeclared (first use in this function)
sd.c:518: (Each undeclared identifier is reported only once
sd.c:518: for each function it appears in.)
make[3]: *** [sd.o] Error 1

Zatímco když udělám syntaktickou změnu (prohodím dva (3 vs. 4) řádky
deklarace), která nemá sémanticky pražádný význam (maximálně se automatická
proměnná v paměti bude vyskytovat na jiném místě)

{
        int target, retval = -ENXIO;
        Scsi_Device * SDev;
        struct request_queue *q;
        target = DEVICE_NR(inode->i_rdev);

        SCSI_LOG_HLQUEUE(1, printk("target=%d, max=%d\n", target,
sd_template.dev_max));
.
.

Je vše v naprostém pořádku. Dotyčné GCC je z RHEL 2.1ES updates... Je v něm
chyba? Pokus o přeložení původního souboru na RHEL 3.0 nevede ke stejné
chybě, přestože výstup z cpp je v obou případech identický...

        target = (( ( ((((unsigned int) ((inode->i_rdev) >> 8)) & 0x80) >>
4) + 
(((unsigned int) ((inode->i_rdev) >> 8)) & 7) ) << (8 - 4)) + (((unsigned
int) (
(inode->i_rdev) & ((1U << 8) - 1))) >> 4));

Když se dívám do starších kernelů (2.4.9), tak tam přibila akorát struct
request_queue *q;, - původně to vypadalo následovně:

{
        int target, retval = -ENXIO;
        Scsi_Device * SDev;
        target = DEVICE_NR(inode->i_rdev);

        SCSI_LOG_HLQUEUE(1, printk("target=%d, max=%d\n", target,
sd_template.d
ev_max));
.
.

	Nerozumím tomu...:-/

-------------------------------------------------------------------
Ing. Pavel Janousek (PaJaSoft)             FoNet, spol. s r. o.
Technicka podpora, Intranet/Internet     Sokolova 67, 619 00 Brno
E-mail: mailto:Janousek na FoNet.Cz         Tel.: +420  5  4324 4749
WWW:    http://WWW.FoNet.Cz/           E-mail: mailto:Info na FoNet.Cz
-------------------------------------------------------------------  



Další informace o konferenci Linux