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