IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Portage visual --> gcc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut Portage visual --> gcc
    Bonjour,

    Je suis en train de faire le portage d'une application conçu sous visual c++ sur le compilateur gcc. Cette application utilise l'option de compilation Zp2 de visual. Je n'arrive pas à trouver d'équivalent sous gcc : je n'ai pas envie de redéfinir toutes mes structures avec l'attribut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __attribute((packed))__
    Quelqu'un à t'il une solution ?

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu as besoin de ça pour quoi ?

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Je vais donner un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
    int a; 
    int b
    short c;
    } toto_t
    Le compilateur traite les structures par packet de 4 octets ce qui fait que sans l'option Zp2, si je fais sizeof(toto_t) on me répond 12 alors que moi je veux que ce sois 10.

    Dans gcc, la seule solution pour que j'ai trouvé est de rajouter __attribute((packed))__ à la fin de la définition de la structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
    int a; 
    int b
    short c;
    } __attribute((packed))__ toto_t
    Si il existe un autre opérateur que sizeof qui donne la taille d'une structure ça m'intéresse. Parce que maitenant que j'y refléchit je trouve ça bête de désoptimiser ma compilation juste pour avoir une valuer juste.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jeje99
    Je vais donner un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
    int a; 
    int b
    short c;
    } toto_t
    Le compilateur traite les structures par packet de 4 octets ce qui fait que sans l'option Zp2, si je fais sizeof(toto_t) on me répond 12 alors que moi je veux que ce sois 10.

    Dans gcc, la seule solution pour que j'ai trouvé est de rajouter __attribute((packed))__ à la fin de la définition de la structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
    int a; 
    int b
    short c;
    } __attribute((packed))__ toto_t
    Si il existe un autre opérateur que sizeof qui donne la taille d'une structure ça m'intéresse. Parce que maitenant que j'y refléchit je trouve ça bête de désoptimiser ma compilation juste pour avoir une valuer juste.
    Cette manip n'est pas du tout portable. Quel est le but de l'opération ?
    • Si c'est pour 'gagner de la place', il y a d'autres moyens (champs de bits, par exemple).
    • Si c'est pour mapper sur une structure d'octets (trames réseau etc.), c'est une erreur de conception.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    C'est pour mapper sur une structure d'octet (récupération de données dans un fichier).

    Si je comprend bien les grandes têtes pensantes de mon entrprise n'ont pas bien fait leur travail. Donnons comme excuse que le code de base remonte à quelques années et que la notion de portabilité n'était pas encore d'une grande importance à l'époque (1997). Pour en revenir à mon problème, je ne peux absument pas modifier le fichier que je lis quelle solution me conseillez vous pour rendre ce code portable ?

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Pour eviter l'ajout d'octets de padding, gcc propose l'option -fpack-struct. Cette option est disponible depuis au moins gcc 2.95.3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -fpack-struct[=n]
        Without a value specified, pack all structure members together without holes. When a value is specified (which must be a small power of two), pack structure members according to this value, representing the maximum alignment (that is, objects with default alignment requirements larger than this will be output potentially unaligned at the next fitting location).
     
        Warning: the -fpack-struct switch causes GCC to generate code that is not binary compatible with code generated without that switch. Additionally, it makes the code suboptimal. Use it to conform to a non-default application binary interface.

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par jeje99
    C'est pour mapper sur une structure d'octet (récupération de données dans un fichier).

    Si je comprend bien les grandes têtes pensantes de mon entrprise n'ont pas bien fait leur travail. Donnons comme excuse que le code de base remonte à quelques années et que la notion de portabilité n'était pas encore d'une grande importance à l'époque (1997). Pour en revenir à mon problème, je ne peux absument pas modifier le fichier que je lis quelle solution me conseillez vous pour rendre ce code portable ?
    Exact, ces têtes pensantes n'ont pas pensé à la portabilité opu même le fait que le compilateur pouvait évoluer lui aussi !
    Une solution sale serait de lire le fichier puis sauvegarder 10 octets par 10 octets - en espérant que l'ordre de la structure ne sera pas changée... -

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Vu ce qui est marqué dans le man de gcc à propos de -fpack-struct[=n]. Je pense que le mieux c'est je continue avec les __attribute((packed))__ que j'ajoute aux déclarations de mes structures.

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu peux peut-être générer un convertisseur de fichiers avec cet attribut-là puis utiliser une version plus portable dans ton code - déjà ne pas utiliser de short par exemple - ? Ceci afin de répondre au point concernant la sous-optimimalité du code généré.

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par jeje99
    Vu ce qui est marqué dans le man de gcc à propos de -fpack-struct[=n].
    Qu'est-ce qui te fais peur? Ca me semble la solution la plus proche de ta compilation Windows.

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    C'est cette ligne qui me fait peur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    causes GCC to generate code that is not binary compatible with code generated without that switch
    Je comprend pas tout mais j'ai l'impression que c'est pas top d'utiliser cette option. Et cet avertissement n'est pas donné pour l'utilisation de __attribute__((packed)). Enfin il est possible qu'il fasse la même chose quand même.

  12. #12
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Par défaut
    Citation Envoyé par jeje99
    C'est cette ligne qui me fait peur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    causes GCC to generate code that is not binary compatible with code generated without that switch
    Je comprend pas tout mais j'ai l'impression que c'est pas top d'utiliser cette option. Et cet avertissement n'est pas donné pour l'utilisation de __attribute__((packed)). Enfin il est possible qu'il fasse la même chose quand même.
    Si je comprends bien cette ligne: imaginons que tu as 2 fichiers c (f1.c et f2.c), tu compiles f1.c avec cette option de maniere a avoir f1.o et f2.c sans cette option de maniere a avoir f2.o. quand tu vas vouloir faire l'edition des liens entre f1.o et f2.o pour obtenir ton executable final tu ne pourras pas car ils ne sont pas compatible "binairement". Mais si tu compile toute ton application avec cette option il ne devrait pas y avoir de pb!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/03/2010, 10h27
  2. Portage Visual C++ 2005 vers Eclipse CDT
    Par inh40 dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 30/05/2008, 00h04
  3. pb de portage de librairy gcc sous VS
    Par fabienpot dans le forum Visual C++
    Réponses: 2
    Dernier message: 05/12/2006, 09h13
  4. Réponses: 1
    Dernier message: 30/05/2006, 22h54
  5. Portage, Librairire de Visual Studio sous Linux ?
    Par HNT dans le forum Visual C++
    Réponses: 9
    Dernier message: 03/02/2006, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo