Ich hoffe ich bin hier OT, weil ich nur über einen compiler-bug
(linux/gcc 3.3.5) stolpere, ansonsten weiss ich nicht weiter:
ich habe eine Klasse mit einer protected Methode und von der leite ich
ab.
Nach einigem Fehlereinkreisen sieht diese funktion nun so aus:
protected:
int messageout( int meta, const char message[] ){
switch( meta ){
/*
case 0: printf( "hallo" ); break;
case 1: printf( "hallo" ); break;
case 2: printf( "hallo" ); break;
*/
case 3: printf( "hallo" ); break;
case 4: printf( "hallo" ); break;
case 5: printf( "hallo" ); break;
case 6: printf( "hallo" ); break;
case 7: printf( "hallo" ); break;
}
return 0;
}
Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
mehrere Meldungen folgender Art:
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
section `.rodata' of lib/ssgthing.o: defined in discarded section
`.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o
Und zwar für jede .cpp (bzw. ihre .o) Datei, in der ich aus einer von
genannter Klasse abgeleiteten Klasse die obige Funktion aufrufe und
jeweils einmal pro Funktionsaufruf.
Und das wars noch nicht: Die Meldungen kann ich folgendermassen
ein/ausschalten: Kommentiere ich ein oder mehrere der switch-Blöcke 3...7
aus, so kommen keine Meldungen mehr. Statt dem case 3-Block kann ich aber
auch ein oder Mehrere der Blöcke von 0..2 aktivieren. Soweit zumindest
meine Beobachtungen.
Ist das nun ein Bug oder habe ich schon wieder etwas Neues über C++
gelernt?
Für Hinweise und ähnliches vielen Dank im Voraus
Frans
--
de.comp.lang.iso-c++ - Moderation: mailto:voyag...@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+...@bud.prima.de
> Ist das nun ein Bug oder habe ich schon wieder etwas Neues über C++
> gelernt?
Ohne vollständige Quellen läßt sich das nicht endgültig sagen. Auf
jeden Fall ist es aber ein GCC- oder binutils-Bug, denn selbst wenn
der Fehler in Deinem Code liegt, solltest Du eine anständige
Fehlermeldung bekommen.
> Und das wars noch nicht: Die Meldungen kann ich folgendermassen
> ein/ausschalten: Kommentiere ich ein oder mehrere der switch-Blöcke 3...7
> aus, so kommen keine Meldungen mehr. Statt dem case 3-Block kann ich aber
> auch ein oder Mehrere der Blöcke von 0..2 aktivieren. Soweit zumindest
> meine Beobachtungen.
Der (potentielle) Bug dürfte nur auftreten, wenn das switch-Statement
per Jump-Tabelle implementiert wird.
Da kann ich nichts falsches sehen.
> Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
> mehrere Meldungen folgender Art:
>
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o
Das sind zum einen Meldungen vom Linker, zum anderen eine Frage - denkst
Du, dass das ein Fehler ist? Ich meine, gibt denn der gcc nicht
ansonsten einen Hinweis auf Fehler/Warning oder so?
Vielleicht ein gcc Bug?
Ali
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o
Vielleicht liegt es auch gar nicht am gcc.
Ich bekomme ähnliche Meldungen bei Benutzung von colorgcc unter SuSE 9.2 und
gcc version 3.3.4 (pre 3.3.5 20040809). Rufe ich gcc direkt auf, bleiben
sie weg. Die erzeugten executables funktionieren aber, deshalb habe ich nie
weiter nach der Quelle dieser Warnung gesucht.
Viele Grüße,
Georg
Das ist ja eigenartig - ich verwende tatsächlich auch colorgcc, dann wird
es wohl daran liegen. Aber auch wenn ich es mir noch nicht genau
angeschaut habe - colorgcc ist nur ein formatier-Perl-Script. Dass es
eigene Fehlermeldungen produziert/hervorruft ist sonderbar..
> Nachtrag: habs grad probiert - der "Fehler" tritt bei mir auch ohne
> colorgcc auf, scheint also nicht daran zu liegen. Macht die Sache nur
> noch ein bischen geheimnisvoller, wenn es bei Dir ohne colorgcc
> funktioniert :).
Ich habe das noch mal ausprobiert, und die Fehlermeldung kommt auch ohne
colorgcc. Ich meine mich aber zu erinnern, daß sie, als sie das erste Mal
auftrat, nur mit colorgcc kam. Offensichtlich stimmt diese Erinnerung
nicht.
> Bist Du Dir sicher, dass du den gleichen compiler (bzw
> eigentlich den linker, glaube ich) verwendet hast den colorgcc auch
> aufruft? (welchen sonst auch immer). Ich habe bei mir gerade nur den
> colorgcc-Pfad aus $PATH rausgenommen..
Ich habe auch noch einen anderen Compiler probiert (gcc 3.4.1), und bei dem
kommt die Fehlermeldung auch. Deinen Code kann ich allerdings sowohl mit
gcc 3.3.4 als auch mit 3.4.1 ohne Fehlermeldung übersetzen.
Es scheint sich also doch um ein gcc-Problem zu handeln, vielleicht fragst
Du mal auf der Mailingliste?
Viele Grüße,
Georg
> Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
> mehrere Meldungen folgender Art:
>
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o
Ich hatte so ähnliche Meldungen vor ein paar Wochen auf meinem
Debian/unstable-System. Die Meldungen sind verschwunden, nachdem ich
das Paket binutils aktualisiert habe, das auch den Linker ld enthält.
Schau mal nach einem aktuelleren binutils-Paket und teste, ob die
Meldungen damit immer noch auftreten.
Gruß, Hubert
> Ich hoffe ich bin hier OT, weil ich nur über einen compiler-bug
> (linux/gcc 3.3.5) stolpere, ansonsten weiss ich nicht weiter:
>
> [..]
> Wenn ich compiliert habe (optimizer ist egal) und linke bekomme ich
> mehrere Meldungen folgender Art:
>
> /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/../../../../i686-pc-linux-gnu/bi
> n/ld: `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' referenced in
> section `.rodata' of lib/ssgthing.o: defined in discarded section
> `.gnu.linkonce.t._ZN10CDebugFeat10messageoutEiPKc' of lib/ssgthing.o
Wenn Du
c++filt _ZN10CDebugFeat10messageoutEiPKc
rufst, bekommst Du den C++ Funktionsnamen:
CDebugFeat::messageout(int, char const*)
Diese Warnung bekomme ich seit gestern auch, und ebenfalls ohne
Konsequenzen für das Programm. Bei mir ist ein operator=().
> Und das wars noch nicht: Die Meldungen kann ich folgendermassen
> ein/ausschalten: Kommentiere ich ein oder mehrere der switch-Blöcke 3...7
> aus, so kommen keine Meldungen mehr. Statt dem case 3-Block kann ich aber
> auch ein oder Mehrere der Blöcke von 0..2 aktivieren. Soweit zumindest
> meine Beobachtungen.
>
> Ist das nun ein Bug oder habe ich schon wieder etwas Neues über C++
> gelernt?
Ich denke das ist eher ein Bug.
Tschau
Andreas
--
Andreas Hünnebeck | email: a...@despammed.com
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc