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

Linux Discussion :

Pourquoi la compilation entre unix et windows est différente ?


Sujet :

Linux

  1. #21
    Débutant Avatar de ..::snake::..
    Inscrit en
    Mai 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 318
    Points : 120
    Points
    120
    Par défaut
    Merci millie ton lien de wikipedia étais ce que je cherchai .

    Tout est explqué

  2. #22
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Shugo78
    Et les appels systèmes spécifiques ? Ca représentent les 10 derniers pourcents ?
    Tu confonds peut-être API et appel système (accessible uniquement depuis l'assembleur ou depuis la fonction C syscall()...).

    Lorsque je dis que 90% des problèmes viennent de la non compatibilité des compilateurs entre eux, il faut aussi comprendre que ce sont, en général, les compilateurs qui fournissent également les libC...

  3. #23
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Tu confonds peut-être API et appel système (accessible uniquement depuis l'assembleur ou depuis la fonction C syscall()...).
    fork(), create_Thread() ce sont des APIs ?

  4. #24
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Ce sont des fonctions faisant partie d'une API utilisant des appels systèmes. Il n'existe que très peu d'appels systèmes comparé à la masse de fonctions présente dans une bonne LibC (par exemple la GLibC). La liste des appels système sous Linux est, de mémoire, dans /usr/include/asm/unistd.h et n'est accessible que depuis l'assembleur ou via la fonction syscall de l'API fournie par la LibC : il doit y en avoir 250 ou moins.

    C'est un amalgame que trop de gens font, de façon consciente ou inconsciente.

  5. #25
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Je pensais que les fonctions tel que open, write, étaient des appels systèmes

    EDIT : Oui, s'en est, j'ai rien dit.

    http://www.die.net/doc/linux/man/man2/syscalls.2.html

  6. #26
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Ce sont des fonctions faisant partie d'une API utilisant des appels systèmes. Il n'existe que très peu d'appels systèmes comparé à la masse de fonctions présente dans une bonne LibC (par exemple la GLibC). La liste des appels système sous Linux est, de mémoire, dans /usr/include/asm/unistd.h et n'est accessible que depuis l'assembleur ou via la fonction syscall de l'API fournie par la LibC : il doit y en avoir 250 ou moins.

    C'est un amalgame que trop de gens font, de façon consciente ou inconsciente.
    Désolé de te contredire mais la page que milie a donnée est formelle :
    fork() est un appel systèmes(mais pas create_Thread qui est son portage pour windows)
    regarde là :
    http://www.die.net/doc/linux/man/man2/syscalls.2.html

  7. #27
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Ce n'est pas contradictoire.

    Il existe heureusement des API qui permettent d'encapsuler la plupart des appels systemes, pour éviter que l'on soit obligé de passer par l'assembleur (ou des choses comme syscall). Sous UNIX, ça se trouve dans les pages de manuel 2.

  8. #28
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    C'est bien ce que je disais : fork() et compagnie sont des fonctions de la libC qui sont écrites en utilisant les appels systèmes (tels qu'accessibles via syscall()) par exemple.

    La grosse différence, c'est que lorsque tu fais appel à fork(), dans ton code assembleur tu te retrouveras avec un CALL fork (fork est bien une fonction encapsulant comme dit plus haut un appel système, le tout codé dans la libC), et si tu fais un appel système violent, tu te retrouveras sous Linux/BSD avec un INT 80h précèdé de ce qu'il faut... ce qui est très différent. On ne peut pas faire une fonction à partir d'un appel système.

    On a la même chose sous DOS avec la fameuse INT 31h (de mémoire).

  9. #29
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Non, DOS est de retour .
    Ouf j'ai eu peur....

  10. #30
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    DOS existe toujours.

    Du moment que Windows continuera à garder une rétro-compatibilité avec ces vieux programmes 16 bits de merde, DOS continuera d'exister, ça c'est une certitude.

    J'aime bien les gens qui disent que DOS n'existe plus "parce qu'on ne le voit plus au démarrage" ! Certes, mais tu peux toujours faire tourner des programmes DOS et en faire de nouveaux ! chercher l'erreur dans tout ça...

  11. #31
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Ah DOS.... Que des bons souvenirs de programmes qui marchaient jamais et qui donnaient jamais le même résultat....
    Nostalgie Nostalgie.
    Mais bon on n'est pas la pour parler de ça .

  12. #32
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par Shugo78
    Ah DOS.... Que des bons souvenirs de programmes qui marchaient jamais et qui donnaient jamais le même résultat....

    DOS, ça marchait particulièrement bien et laissait une très (trop) grande liberté à l'utilisateur... comme décharger le système de la mémoire pour lancer Linux

  13. #33
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par gorgonite
    DOS, ça marchait particulièrement bien
    Tellement bien qu'un petit *((int*)0) = 1, et tu étais parti pour un reboot Ah, que de bon souvenir les OS monotâche

    Cela dit, à part avec QBasic, je n'ai jamais programmé pour DOS

  14. #34
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par millie
    Cela dit, à part avec QBasic, je n'ai jamais programmé pour DOS


    DOS, mon premier système d'exploitation avec des utilitaires comme Turbo Pascal, Turbo Basic (tellement mieux que QBasic ), Turbo C++ et Turbo Assembleur ; et d'autres trucs moins bons... comme win 3.1

  15. #35
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Points : 5 075
    Points
    5 075
    Par défaut
    On peut revenir à la question initiale?


  16. #36
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    __snake__, j'ai l'impression qu'il te manque certaines bases.
    Donc je te propose de reprendre depuis le début.

    Le langage C
    Il existe des normes qui décrivent ce qu'est le langage C. Prenons le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
     
    int main (void) {
        printf("Hello World !\n");
        return 0;
    }
    La norme C ansi impose que la librairie stdio existe et qu'elle contienne entre autre la fonction printf.
    La fonction printf possède au moins un argument qui est la chaîne de format. Dans le cas où il n'y a qu'un seul paramètre c'est cette chaîne qui sera envoyée tel quel (après transformation des \n \t etc.) sur la sortie standard (généralement reliée au terminal, mais ceci n'est pas défini).
    La norme C ansi dit aussi à peu de chose près que la fonction main est appelée automatiquement au lancement du programme, et que la valeur de retour de cette fonction a une signification dépendante du système (mais là je suis pas sûr).

    Autrement dit, tous les compilateurs respectant la norme C ansi devraient fournir un exécutable qui fait exactement la même chose bien que l'exécutable fourni soit totalement différent.


    Le compilateur
    C'est un programme qui est chargé de transformer le code source (ici écrit en langage C) en un fichier exécutable qui pourra être exécuté par le système.
    Si le compilateur respecte la norme C ansi, le fichier exécutable donnera le résultat attendu (ici, l'affichage de "Hello World !\n" dans le terminal).
    Mais pour donner ce résultat, le compilateur windows va utiliser les librairies de windows qui elles-même utilise des appels système de windows. Ensuite il va "encapsuler" le code exécutable dans un format (le format PE) de façon à ce que le système windows puisse charger plus facilement le code en mémoire. Le format PE ne sert qu'à rajouter des informations sur le code lui-même (par exemple la taille du code, la taille des données etc.).
    Et pour finir, il met le code et son "enveloppe PE" dans un fichier hello.exe (mais ce n'est rien d'autre qu'un nom de fichier).

    Le compilateur Linux lui va utiliser les librairies de Linux, qui utilisent des appels système de Linux, puis il va encapsuler le code dans un format ELF qui contient à peu près les mêmes infos que le PE.
    Et enfin le code et son "enveloppe ELF" sont écrits dans un fichier hello. Encore une fois ce n'est qu'un nom de fichier, on pourrait mettre n'importe quoi.


    Le système d'exploitation
    Lui, il fourni des appels système (c'est un peu comme des fonctions, mais intégrés au coeur du système), il fourni des librairies qui lui sont spécifiques et qui tire parti de fonctionnalités qu'on ne retrouve pas forcément sur d'autres systèmes. Ces librairies sont différentes de celles du langage C qui sont en général fournis avec le compilateur.
    Le système fourni aussi (ou plutôt impose) un ou plusieurs format(s) d'exécutables que le système pourra lire pour pouvoir ensuite charger en mémoire le programme qu'il contient.


    Le processeur
    J'en ai pas parlé jusque là pour ne pas tout embrouiller. Le processeur fourni un ensemble d'instructions élémentaires. Le compilateur lorsqu'il compile le code en lui-même, il transforme les instructions du langage C en une suite d'instructions processeur.



    La portabilité
    On dit qu'un code source (en C par exemple) est portable si on peut le compiler sur différents système sans avoir à toucher au code.
    Si le code C utiliser des fonctionnalités qui sont spécifiques à une certaine plate-forme (système d'exploitation + processeur en gros), alors le code n'est plus portable.
    C'est là qu'interviennent les normes.
    Les normes définissent une syntaxe et une sémantique. Par exemple elle peut définir que la fonction printf doit recevoir au minimum 1 argument, et que cet argument est envoyé sur la sortie standard.
    En revanche une norme peut aussi dire que la sémantique de certaines choses ne sont pas défini. Par exemple la sémantique du mot-clé registery n'est pas défini, il ne faut donc pas que le programme repose sur la signification qu'un compilateur à donné à ce mot. Car sur une autre plate-forme, ça sera un autre compilateur et la sémantique de ce mot peut être différente.
    (Note : sur une même plate-forme il peut exister plusieurs compilateurs différents comme borland et gcc sous windows. Bien entendu les mêmes problèmes se posent.)



    Voilà mon gros pavé, j'espère qu'il t'aidera à y voir plus clair.
    Et si j'ai fait des erreurs, au temps pour moi. Que les gourous de ce forum me corrigent.


    PS : InOCamlWeTrust, non, DOS n'existe plus, il n'en existe plus qu'une pâle émulation. Ça fait un moment déjà que windows ne repose plus sur DOS (Me à été le dernier).

  17. #37
    Débutant Avatar de ..::snake::..
    Inscrit en
    Mai 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 318
    Points : 120
    Points
    120
    Par défaut
    Je comprend mieux , ce que veux dire portable !
    T'as la notion pédagogique Celelibi man

  18. #38
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Citation Envoyé par Celelibi
    La norme C ansi dit aussi à peu de chose près que la fonction main est appelée automatiquement au lancement du programme, et que la valeur de retour de cette fonction a une signification dépendante du système (mais là je suis pas sûr).
    Si la valeur peut être différente d'ailleurs pas souçis de portabilitée, il est bien de retourner la constante EXIT_SUCCESS en cas de dérouelement correcte et EXIT_FAILURE si on est amené à quitter à cause d'une erreur.

  19. #39
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    mais de toutes façons ça n'a rien à voir avec la question de départ...

    Comme on l'a dit 2 ou 3 posts plus haut, QUEL QUE SOIT le langage (y compris assembleur), QUEL QUE SOIT le type de fonction utilisé (système ou non), NOUS programmons en texte (heureusement, sinon ce serait pénible)..

    Pour traduire ce texte en instructions machine, les compilateurs ont besoin de connaître les caractéristiques de la machine sur laquelle ils tournent, et les instructions auquelles elle répond.

    Ils traduisent donc notre texte en langage machine EXECUTABLE. Bien évidemment cette traduction est dépendante de la machine et du système d'exploitation.

    D'où l'impossibilité (sauf maintenant avec les outils cross-compilation) de créer sous unix un exécutable pour Windows, ou sous Windows de créer un exécutable pour Linux. Mais c'est pareil entre différentes machines *n*x : un exécutable créé sous Linux ne marchera pas sous Solaris ou HPUX ...

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    bon je voie que sur ton poste pas eu la bonne reponse, je vais t'expliquer

    cela viens du fait des adressages memoire de base de l'acces au disque entre autre.
    sous linux le dump de lecture du disque dur se fait pas a la meme adresse que le dump du systeme windows

    ( j'ai plus les adresse en tete mais je peux te les retrouvé si tu veux )
    en plus sous linux, tu utilise un autre systeme de codage de donné physique sur le disque ( ext et NTFS sont totalement different )

    en plus les gestions des instruction sont propre au systeme de par sa conception.

    exemple linux :
    une gestion de memoire est faite par parcelle --> un block --> une page
    windows n'a pas la capacité de géré ton tas de memoire de la sorte d'ou les les problèmes lors de malloc ( unix et windows , si tu code en C tu connais ce pb )

    certe les Instructions machines assembleur sont theorique les meme hors si tu code en Assembleur sous linux et windows su y vera 2 norme de codage différent .
    les compilateur linux utilise la NORME AT tandisque que windows utilise une autre norme ( je sais plus sont nom )

    tu va me dire en ASM un :
    mov AX,2 est similiaire a un MOV 2,%AX sous linux
    oui l'adressages est le meme ton registre du CPU est le meme
    mais le codage diffère
    d'ou l'interpretation du code par le compilateur different de linux a windows

    voila j'espere t'avoir eclaircie un peu le probleme

Discussions similaires

  1. Rapatrier des fichiers entre unix et windows
    Par diamond_bleu dans le forum Administration système
    Réponses: 6
    Dernier message: 14/06/2007, 16h41
  2. [JASPER] Différence entre UNIX et Windows
    Par relivio dans le forum Jasper
    Réponses: 1
    Dernier message: 11/12/2006, 15h56
  3. Rcp entre Unix et Windows 2000
    Par alternatyve dans le forum Réseau
    Réponses: 2
    Dernier message: 16/10/2006, 13h23
  4. Réponses: 5
    Dernier message: 07/07/2006, 11h51
  5. Réponses: 5
    Dernier message: 11/04/2006, 10h46

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