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

Programmation d'OS Assembleur Discussion :

Valeur de -Ttext dans un makefile


Sujet :

Programmation d'OS Assembleur

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 104
    Points : 1 748
    Points
    1 748
    Par défaut Valeur de -Ttext dans un makefile
    Bonjour,

    Je lis actuellement l'excellent tuto de Michelizza, mais je rencontre des problèmes chez moi. Notamment cette partie : https://michelizza.developpez.com/re...e-systeme/#LVI

    J'ai simplement la ligne "kernel : loading new gdt..." qui défile à l'infini et de temps en temps le bootloader qui se relance... Manifestement, il y a un soucis. Est-ce que cela fonctionne chez vous ? Comment faire fonctionner cet exemple ?

    J'utilise QEmu. (Je ne suis pas à l'aise avec Bochs, trop relou à paramétrer)

    J'ai légèrement modifié les Makefile afin de supprimer quelques erreurs. (Je ne sais pas si c'est la cause)

    Une piste ?

    Merci par avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 104
    Points : 1 748
    Points
    1 748
    Par défaut
    Bon, je me réponds à moi-même. J'ai ENFIN trouvé la source du problème, complètement par hasard.

    Y avait un problème dans un Makefile. J'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ld -melf_i386 -Ttext 1000 $^ -o $@
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ld -melf_i386 -Ttext 2000 $^ -o $@
    . Et maintenant ça roule impec !

    Maintenant, reste à savoir pourquoi ça coinçait...

  3. #3
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    3 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 3 148
    Points : 9 916
    Points
    9 916
    Par défaut
    Ttext est une option du compilo pour indiquer où se trouve le code en memory map (en gros pour que les call/label n'ont pas une adresse faussé)
    La bonne adresse doit être 0x1000 si j'ai bien compris :


    Mais d’après OS Dev on peut mettre du code à 0x500 :
    https://wiki.osdev.org/Memory_Map_(x86)

    Et si ça marchais pas à 1000 , c'est que 1000 en hexa fait 0x3E8 , qui correspond aux table d’interruption et aux BIOS
    A 2000 tu es à 0x7D0 donc un espace libre .

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 104
    Points : 1 748
    Points
    1 748
    Par défaut
    C'est bizarre, cette histoire ! Quelle pourrait donc être l'origine du problème ?

    D'après la doc de l'outil ld, Ttext est toujours en hexa. Donc le "0x" est facultatif.

    Avec 500 ou 1000 ça marche pas chez moi.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 104
    Points : 1 748
    Points
    1 748
    Par défaut
    J'ai sorti le fichier lié en assembleur, et effectivement il y avait un gros problème. En fait, le fichier sorti était en format ELF. Ca pouvait pas marcher puisqu'il fallait du binaire.

    Voici le makefile, que j'ai modifié et qui fonctionne maintenant :

    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    OBJ=kernel
    CC=gcc -Wall -m32
     
    all: $(OBJ) 
     
    kernel.elf: kernel.o screen.o lib.o gdt.o idt.o interrupt.o int.o pic.o
    	ld -melf_i386 -o $@ -Ttext 1000 $^
     
    kernel: kernel.elf
    	objcopy -O binary kernel.elf kernel.bin
     
    int.o: int.asm
    	nasm -f elf32 -o $@ $^ 
     
    .o: .c 
    	$(CC) -c $^
     
    clean:
    	rm -f $(OBJ) *.o *.elf

    A l'origine, le "ld" avait bien l'option "--oformat binary", mais cela me générait plein d'erreurs ! (liées à la __GLOBAL_OFFSET_TABLE__ ) D'où la modif que j'avais effectuée et qui ne marchait pas bien du coup. C'est peut-être pour ça qu'avec l'adresse 0x2000 ça fonctionnait, mais ce n'était que pur hasard je suppose

    Est-ce qu'il y a moyen de générer du binaire depuis "ld" directement, sans passer par "objcopy", sans que cela me génère un paquet d'erreurs ? Bon après, c'est peut-être pas super indispensable... Si ça marche comme ça...

  6. #6
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    3 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 3 148
    Points : 9 916
    Points
    9 916
    Par défaut
    GCC fournit du .elf par défaut , du coup , étonnant que cela marche...
    (mais il y'a des chances qu'il exécute du code "aléatoire" , vu que l'entete du .elf est exécuter...)
    Sinon tu peux remettre "-oformat binary" sur ld , et donc il fournit le binaire , objcopy doit sûrement faire une simple copy.

    Je n'utilise jamais objcopy pour la sortie des binaire seulement ld.

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    août 2011
    Messages
    15 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 15 558
    Points : 37 527
    Points
    37 527
    Par défaut
    Est-ce qu'il y a moyen de générer du binaire depuis "ld" directement, sans passer par "objcopy", sans que cela me génère un paquet d'erreurs ?
    Regarder du coté de l’option gcc :
    -wl permet de passer directement des options au linker.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 18/03/2005, 09h23
  2. MAKEFILE : Comment récupérer l'OS dans le makefile
    Par nana1 dans le forum Systèmes de compilation
    Réponses: 12
    Dernier message: 14/09/2004, 16h23
  3. Faire un setenv dans un Makefile
    Par papayou42 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 06/07/2004, 10h37
  4. Valeur par défaut dans une table objet
    Par Ricky81 dans le forum Oracle
    Réponses: 12
    Dernier message: 18/03/2004, 11h52
  5. Réponses: 2
    Dernier message: 23/11/2003, 18h44

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