Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 12-05-2014 11:01:47

gargamel79
Membre
Lieu : Bressuire
Distrib. : wheezy et jessie
(G)UI : xfce
Inscription : 15-11-2009

quel gcc choisir

bonjour à toutes et à tous,
Avec sarge, lenny, squeeze ça se passait bien...
Mais avec wheezy mon mini OS se plante.
Par défaut, le gcc de Wheezy pointe sur gcc-4.7, mais le paquet gcc-4.4 est heureusement disponible.
Essai avec gcc-4.4 (en changeant le lien ou en modifiant le Makefile) : cela fonctionne parfaitement!
Ayant trouvé "comment" il ne reste plus qu'à trouver "pourquoi", ie faire qu'avec gcc-4.7
cela fonctionne également...
Mais là, c'est une autre histoire, malgré de nombreux essais d'options de compilation et de recherches sur le WEB
pas moyen de trouver la faille.
Avec gdb, et sous qemu, je vois qu'une (au moins) variable est écrasée dès le lancement de gdb (par "continue").

Lancé sur une machine réelle, avec grub2, j'obtiens:
error overlap detected

Je pense que c'est la structure passée à Grub (dans le protocole multiboot) qui n'est plus générée correctement
avec gcc-4.7 (et même à partir de gcc-4.6).

Avec gcc-4.4, tout se passe bien (simulateur qemu ou machine réelle). Mais je crains que gcc-4.4 ne soit
plus maintenu à l'avenir...

Quelqu'un a t-il une suggestion ?

Hors ligne

#2 12-05-2014 12:36:30

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : quel gcc choisir

Salut,

J'imagine deux possibilités. Soit gcc 4.7 fait une optimisation qui casse quelque chose dans ton programme, auquel cas il te suffit de trouver l'argument pour désactiver cette optimisation. Soit c'est en fait ton code qui contient un morceau au comportement non-spécifié (donc du code a priori invalide), qui marchait avec gcc 4.4 mais ne marche plus avec 4.7 parce que la manière avec laquelle gcc traite ce code non-spécifié a changé.

C'est à toi de voir suivant ton code, mais rester bloqué avec gcc 4.4 ne me semble pas être une option. smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#3 12-05-2014 16:47:03

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : quel gcc choisir

On me confirme dans l'oreillette que c'est très probablement un problème de code qui utilise un comportement indéfini de C, que le compilateur gère de manière différente au cours du temps. La seule solution viable étant alors de corriger le bug dans le code source smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#4 15-05-2014 16:57:52

gargamel79
Membre
Lieu : Bressuire
Distrib. : wheezy et jessie
(G)UI : xfce
Inscription : 15-11-2009

Re : quel gcc choisir

Tout d'abord, merci pour votre encouragement à poursuivre...
Après moult essais que je ne peux résumer ici, il me vient un doute.
Appeler une fonction écrite en C à partir d'un module C++ est classique, il suffit d'écrire:
extern "C" void fonctionEnC(); (par exemple)
Par contre, le cas dual, appeler une fonction (pas forcément une méthode) d'un module compilé
en C++, à partir d'une fonction appartenant à un module C, est moins classique...
Pour faire le lien (ld) j'utilise, dans le module C++:
extern "C" void fonctionEnC++(); (par exemple)
fonctionEnC++() est définie, à la suite dans ce même module (.cpp).
Si je ne fais pas cela, fonctionEnC++(), n'est pas connue au lien par le module en C (je suppose
à cause du "mangling" du préprocesseur C++).
J'utile un sous ensemble du C++, ne permettant pas, entre autre, la gestion des classes dynamiques...
L'avantage est que l'héritage reste utilisable (pour les classes statiques). Dans le Makefile:
  CPPFLAGS  = -Wall -nostdinc++ -nostdlib -fno-builtin -fno-rtti -fno-exceptions

De toute façon, un OS est une auberge espagnole! Le tas n'existe pas au départ.

C'est la déclaration: extern "C" void fonctionEnC++(); qui est peut-être problématique.
Qu'en pensez-vous ?

Hors ligne

#5 17-05-2014 11:57:24

GuilOooo
Membre
Distrib. : Debian Stable
Noyau : Noyau par défaut de Stable
(G)UI : DWM
Inscription : 04-05-2013

Re : quel gcc choisir

J'ai un gros doute sur ta manière d'appeler du C++ depuis du C. Le fait de déclarer “extern "C" void fonctionEnC++()” va dire au compilateur d'utiliser la convention d'appel du C pour invoquer ta fonctionEnC++. Or, cette dernière devrait être invoquée avec la convention d'appel du C++, qui est assez différente. Il y a le name mangling que tu évoques, mais aussi certains ajouts (par rapport au C) pour gérer les exceptions, les templates, l'appel de méthodes virtuelles, etc. Cette convention est utilisée pour toutes les fonctions C++, y compris celles qui ne se servent pas de la surcharge, du code virtuel ou des exceptions.

Je ne sais plus bien comment mélanger proprement C et C++ (les esprits chagrins te diraient que c'est impossible à faire proprement). À mon avis, la meilleure chose à faire est de vérifier sur le Web (la FAQ C++ officielle évoque probablement la question).

Au passage, je crois me souvenir que l'édition de liens d'un programme C++ est une opération complexe, bien plus que l'édition de liens du C par exemple. Es-tu sûr que le bon vieux “ld” gère le C++ proprement ? Ne faut-il pas un linker spécial ? Dans le doute, j'essaierais de faire l'édition de liens avec g++ directement, pour voir si ça vient de là.

Mais au final, pourquoi vouloir mélanger C et C++ ? Ne serait-il pas plus simple de tout faire en C++, quitte à avoir certains modules qui ne se servent jamais de classes ni de templates, etc. ? Au moins, les choses seraient claires, il n'y aurait pas de mélanges subtils de conventions d'appel.

Bon courage pour ton projet ! smile
GuilOooo

Hors ligne

#6 20-05-2014 15:07:30

gargamel79
Membre
Lieu : Bressuire
Distrib. : wheezy et jessie
(G)UI : xfce
Inscription : 15-11-2009

Re : quel gcc choisir

J'ai l'impression que C++ 2011 a provoqué des modifs. importantes, notammant dans g++ ...
Avec gcc-4.7 et cetaines modifs dans mon code tout se passe bien si je lance à partir de grub legacy.
Mais avec grub 2 j'obtiens un "overlap detected"  et ça ne se lance pas. Il doit effectivement y avoir
des problèmes au lien.
Je continuerai donc d'utiliser mon joujou avec g++-4.4 (et gcc-4.4) autant que cela reste possible.
Merci pour votre aide.

Hors ligne

Pied de page des forums