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 :

Programme compilé en 32 bits ou 64 bits


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 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut Programme compilé en 32 bits ou 64 bits
    Bonjour,

    Est-il possible de savoir depuis le code du programme, s'il a été compilé en 32 ou 64 bits ?

  2. #2
    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 oranoutan
    Est-il possible de savoir depuis le code du programme, s'il a été compilé en 32 ou 64 bits ?
    Peut être. A quoi ça pourrait bien servir ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Il a des morceaux de code dans le code principal que j'aimerai par exemple exécutés uniquement sur des environements 32 ou 64 bits ...

  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 oranoutan
    Il a des morceaux de code dans le code principal que j'aimerai par exemple exécutés uniquement sur des environements 32 ou 64 bits ...
    Du code 64 bit ne s'exécutera jamais sur une machine 32-bit. Ce genre de problème est réglé par la compilation conditionnelle. Il faut produire 2 exécutables (monappli32 et monappli64, à partir du même source) en changeant la définition des macros globales ad hoc.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Ce sont les options du compilateur qui définissent l'architecture sur laquelle va être portée le programme, mais en compilant pour amd64, la valeur renvoyée par sizeof devient un long unsigned int.
    La différence est dans l'adressage (8 octets au lieu de 4 octets) mais aussi dans la taille des différents types
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TaillesEntiersAMD64.c :
    la taille d'un char est de 1 octets
    la taille d'un short est de 2 octets
    la taille d'un int est de 4 octets
    la taille d'un long int est de 8 octets
    la taille d'un long long int est de 8 octets
    la taille d'un float est de 4 octets
    la taille d'un double est de 8 octets
    la taille d'un long double est de 16 octets
    la taille d'un size_t est de 8 octets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    TailleEntiersi386.c:
    la taille d'un char est de 1 octets
    la taille d'un short est de 2 octets
    la taille d'un int est de 4 octets
    la taille d'un long int est de 4 octets
    la taille d'un long long int est de 8 octets
    la taille d'un float est de 4 octets
    la taille d'un double est de 8 octets
    la taille d'un long double est de 12 octets
    la taille d'un size_t est de 4 octets
    [EDIT](NB: je n'avais pas vu la réponse précédente. Est ce qui est entre [edit][/edit] correspond à ce que vous vouliez dire?)

    Il y a un problème par exemple dans les lignes du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("la taille d'un size_t est de %ld octets\n",sizeof(size_t));
    . (je ne saurai pas étendre la démonstration, pas assez de connaissance du C) si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o ./a.out  -pedantic -Wall -Wextra -march=k8 -mtune=i386 -m32  TailleEntiersAMD64.c
    , J'ai l'avertissement suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TailleEntiersAMD64.c:16: attention : format ‘%ld’ expects type ‘long int’, but argument 2 has type ‘unsigned int
    . Est-ce qu'il faudrait remplacer le type du format de sortie par une macro pour avoir un code portable et maintenable autrement que par la fonction "remplacer" des éditeurs de texte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #if ARCH == AMD64
    #define SIZEOF_OUT "%ld"
    #elif ARCH == i386
    #define SIZEOF_OUT "%d"
    #endif
    Je crois qu'il faudrai écrire le programme avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("la taille d'un size_t est de SIZEOF_OUT octets\n",sizeof(size_t));
    pour éviter les erreurs de compilation et les warnings. Ça sûrement à voir avec le makefile et le ./configure, bien que je ne m'y connaisse pas trop.

    Ça donne sûrement une idée de ce qu'il ne faut pas faire pour écrire du code portable, mais c'est une question d'expert un peu. Je me demande par exemple si faire des casts est une bonne manière d'écrire un code portable.[/EDIT]

    On remarque que les tailles des types "simples" (short, char, int, float, double) ne changent pas, seulement celles des pointeurs et des types strictement calculatoires du genre long long int et long double (long double sur 128 bits pour AMD64 donc deux registres du processeur, contre long double sur 96 bits pour i386, ce qui fait 3*32 bits=trois registres processeurs). Ça donne une certaine idée des optimisations de calcul possibles avec le processeur AMD64.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o ./a.out  -pedantic -Wall -Wextra -march=i386 -m32
    signifie une compilation pour le jeu d'instructions i386 avec des instructions 32 bits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o ./a.out  -pedantic -Wall -Wextra -march=k8 -m64
    signifie une compilation pour l'architecture k8 (AMD64) avec un jeu d'instructions 64 bits.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Bonjour,

    merci à vous deux pour vos réponses.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #if ARCH == AMD64
    #define SIZEOF_OUT "%ld"
    #elif ARCH == i386
    #define SIZEOF_OUT "%d"
    #endif
    C'est quelque chose dans ce genre que je cherche mais je ne sais pas ou tu as trouvé le "ARCH", tu utilises quoi comme compilateur ? moi gcc.
    Je n'ai rien trouvé la dessus dans la doc.

    Mais cela m'a donné une idée dont voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *arch;
     
    switch (sizeof(long int))
    {
    	default: arch="Inconnu"; break;
    	case 4: arch="x86/32bits"; break;
            case 8: arch="x86-64/64bits"; break;
    }
     
    printf("architecture utilisée : %s", arch);
    Si vous avez quelque chose de mieux n'hésitez pas, merci.

Discussions similaires

  1. Faire tourner un programme 32 bits sous 64 bits
    Par rambc dans le forum Débuter
    Réponses: 7
    Dernier message: 01/03/2013, 00h32
  2. programme avec instruction MOVE et décalage de bit.
    Par jerdel dans le forum Automation
    Réponses: 4
    Dernier message: 17/01/2012, 14h38
  3. Réponses: 0
    Dernier message: 07/04/2011, 14h38
  4. [COMPILER] [MEX] compiler du C sous Vista 64 bits
    Par S4sha dans le forum MATLAB
    Réponses: 11
    Dernier message: 29/02/2008, 21h04
  5. compilation 64 bits sur 32 bits
    Par YéTeeh dans le forum C++
    Réponses: 8
    Dernier message: 05/01/2008, 17h26

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