[linux-l] Fragen zum Compiler gcc-3.4.x

Juergen Rienaecker j.rienaecker at arcor.de
So Nov 7 10:50:02 CET 2004


Ich habe mal ein paar Fragen zum Compiler gcc-3.4.x:

Seit wenigen Tagen gibt es ja schon gcc-3.4.3,
aber Suse ignoriert ihn für SUSE LINUX 9.2.
Warum ?
Daß es eventuell noch Probleme beim gcc-3.4.x gibt, dürfte für Suse
nicht der Grund sein.
Sonst hätte man die SuSE 9.1 auch nicht mit dem problematischen
Kernel ausliefern können.

Also liegt es daran, daß einige Quellpackete sich nicht mit dem
gcc-3.4.x vertragen.

Der Artikel im Linux-Magazin 08/04 hat mich neugierig gemacht.
Man vergleicht dort den GCC-3.4.0 mit dem Intel CC.

Also habe ich ihn auf meiner Suse-9.1 installiert, aber so,
daß ich auch noch den gcc-3.3 nehmen kann, wenn der gcc-3.4.x
nicht akzeptiert wird.

Meine Erfahrungen: neuere Quellpackete mag er. Bei älteren
kann  er streiken (z.b. bei gnome-2.6.1 gibt es noch einige,
die er nicht mag)
Die neuen 2.6.x Kernel von kernel.org sind auch kein Problem.
Den SuSE-kernel mag er natürlich nicht.

Nun aber meine Fragen:

Compiliert man *src.rpm Pakete von Suse mit rpmbuild -bb
so ist der Compiler unzufrieden mit
gcc -m32 -O2 -g -march=i586 -mcpu=i686 ....

"  mcpu is deprecated use mtune or march " oder so ähnlich

Ich habe lange gesucht, woher diese flags kommen und bin schließlich
fündig geworden:
in /usr/lib/rpm/rpmrc Zeile 16 steht

"optflags: i586 -O2 -g -march=i586 -mcpu=i686 -fmessage-length=0"

Da 2 mal -march mir nicht sinnvoll erschien
habe ich -mcpu=i686  durch -mtune=i686 ersetzt.

Ist das richtig ?

Was ist der Unterschied zwischen mtune und march ?

Ich suche noch Dokumentaion zum gcc-3.4.x. Was beim Compilieren
und Installieren des gcc-3.4.3 entsteht ist sehr dürftig.

Setzt man den gcc-3.4.3 auf SuSE kernel-source-2.6.5-7.111 an,
so bricht er schon an linux/include/linux/fshooks.h ab.
Dort steht ab Zeile 22

 typedef enum {
         false,
         true
 } boolean_t __attribute__((__mode__(__QI__)));

Er mag hier __QI__ nicht.

In Linux-2.6.6 gibt es kein fshooks.h aber man braucht auch boolean_t

Also steht nun bei mir in fshooks.h
 typedef enum {
         false,
         true
 } boolean_t;

Damit geht es. Ist das okay ?

Die nächste Klippe ist (mit meiner .config) net/ipv4/ip_output.c:

In linux/include/net/ip.h steht

 extern inline int ip_dst_output(struct sk_buff *skb)
 {
    return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL,
             skb->dst->dev, dst_output, skb->dst->xfrm != NULL);
 }

und in linux/net/ipv4/ip_output.c ab Zeile 126

 #ifdef CONFIG_NETFILTER
 /* out-of-line copy is only required with netfilter */
 int ip_dst_output(struct sk_buff *skb)
 {
     return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL,
              skb->dst->dev, dst_output, skb->dst->xfrm != NULL);
 }
 #endif

Diese Redeklaration kann der gcc-3.4.3 nicht und bricht ab.

Ich habe linux/include/net/ip.h ab Zeile 218 geändert

 #ifdef CONFIG_NETFILTER
 extern int ip_dst_output(struct sk_buff *skb);
 #else
 extern inline int ip_dst_output(struct sk_buff *skb)
 {
    return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL,
             skb->dst->dev, dst_output, skb->dst->xfrm != NULL);
 }
 #endif

Damit geht es dann mit meiner .config (nur 20% der ursprünglichen
module).

Die letzte Warnung:

*** Warning: "strcpy" [sound/oss/emu10k1/emu10k1.ko] undefined!

juckt mich nicht, da ich den Modul emu10k1.ko nicht brauche.

Ist diese Änderung von ip.h okay ?

Der Kernel funzt jedenfalls.
Linux version 2.6.5-7.111 (geeko at buildhost) (gcc version 3.4.3)
   #1 Sat Nov 6 19:48:27 CET 2004

Warum der Susekernel:
Na das subfs für die Cdromlaufwerke ist doch sehr angenehm.
Nur die CD ins Laufwerk legen und man kann auf sie zugreifen.
Danach kann man sie wieder entnehmen.
Alles ohne mount und umount.

In meiner Installation gibt es für den gcc-g++-3.4.3 natürlich
 /usr/lib/libstdc++.so.6.0.3
und
 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.3

aber nicht als rpm-Paket installiert.

damit findet mein XFree86-Mesa-4.3.99.902-43.31.i586.rpm sie nicht.
Ich muß also mit --nodeps instalieren.

Aus dem ganzen gcc--g++-3.4.3 Paket bräuchte ich eigentlich nur für
die libstdc++.so.6.0.3 ein rpm-Packet.
Wie kann man das schaffen ?
Die Hilfen für das Bauen von SPECS sind für den Anfänger für so
einen etwas diffizielen Fall nicht so hilfreich.

Ich hoffe auf eine Antwort auf meine etwas ausgefalleren Fragen.

Es grüßt Jürgen Rienäcker,
--
der als Rentner zu hause ohne Hilfe von Kollegen sich mit Linux
beschäfftigt, aber als Rentner auch Microsoft ignorieren kann.



Mehr Informationen über die Mailingliste linux-l