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

Ihno Krumreich ihno at lst.de
Sa Dez 4 00:53:01 CET 2004


On Sun, Nov 07, 2004 at 10:50:02AM +0100, Juergen Rienaecker wrote:
> 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.

Wahrscheinlich sind es viele Pakete die mit 3.4 sich nicht uebersetzen
lassen.

> 
> 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.

Im SPECfile gibt es einen Abschnitt %files. Dort wird angegeben
welche Dateien teil des binaere RPM werden sollen. Einfach nur die lib
eintragen.

Gruss

Ihno




Mehr Informationen über die Mailingliste linux-l