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 :

Linkage 32 bits


Sujet :

Programmation d'OS Assembleur

  1. #1
    Futur Membre du Club
    Linkage 32 bits
    Bonjour à tous,
    Dans l'optique de créer un petit os, je me heurt à un problème problématique (forcément) :
    Quand je link un code source C, compiler en fichier objet avec gcc, je ne parvient pas à me créer d’exécutable 32 bits correct. Je m'explique : je veut un fichier 32 bits exécutable standard, c'est à dire juste avec du code exécutable, pas avec des headers et une structure spéciale telle que le elf, par exemple. Pour ld, on peut utiliser la commande :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $ ld --oformat binary

    Mais comme mon pc est en 64 bits, je ne peux pas le faire pour des fichier 32 bits.
    Sinon, j'ai une autre question :
    gcc -c crée un fichier exécutable binaire, c'est ça ? Mais simplement, sans les headers des fichiers exécutables du style elf etc ?
    Ensuite, si on utilise un désassembleur, est ce que l'on voit les headers ?
    Enfin, les commandes :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -m32 -c monfichier
    gcc -m32 -c monfichier2
    ld -m elf_i386 monfichier.o monfichier2.o -o monexecutable

    donnent le même résultat que :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    gcc -m32 -c monfichier

    où monfichier est monfichier et monfichier2 combinés ensemble, lorsque j'utilise un désassembleur pour voir le résultat.
    Est ce normal ?
    Normalement, comme je link en elf, je devrais avoir un fichier elf, non, pas un binaire pur ?

  2. #2
    Expert éminent
    Pour le 32 bits ,je ne comprend pas ta question , le linker ne transforme pas du code en 64 bits en 32 bits ou inversement quand tu fais ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $ ld --oformat binary

    Il va juste te filer le binaire brut du elf , si le elf c'est du 64 bits il te fera du 64 bits , si c'est du 32 bits il te filera du 32 bits, si c'est de l'ARM il fera de l'ARM.
    Bref , c'est dans la compilation le souci , pas le linker.
    Et comme tu as mis "gcc -m32" je comprend encore moins ta question.

    Ensuite, si on utilise un désassembleur, est ce que l'on voit les headers ?
    Non , surtout un header qui est là juste pour aider le compilateur à compiler ,c'est juste des infos , ça ne génère aucun code.

    Est ce normal ?
    Non , normalement si tu fais ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gcc -m32 -c monfichier.c  -o monfichier.o
    gcc -m32 -c monfichier2.c  -o monfichier2.o
     
    ld --oformat binary monfichier.o monfichier2.o -o monexecutable

    Normalement tu as les deux fichier .o et un fichier binaire brut

    Le linker n'efface rien , donc tu dois retrouver les .o et donc non un .o ça doit pas être équivalent à du ld avec sa sortie en binaire.

    Par contre il faut quand même mettre les options -Ttext et-Tbss au minimum sinon le code risque pas de marcher (âpres je ne sais pas si par défaut les adresses text et bss sont correct).

  3. #3
    Futur Membre du Club
    Cc,
    Merci de ta réponse.
    En fait, je pose cette question car quand je link un code compilé avec l'option -m32, ça me met une erreur disant que le format du fichier d'entrée (32 bits) ne correspond pas au format du fichier de sortie (64 bits). Enfin, je crois que c'est ce que veux dire le message d'erreur.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ld: i386 architecture of input file `kernel.o' is incompatible with i386<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />86-64 output
    ld: kernel.o: in function `scrollup':
    kernel.c<img src="images/smilies/icon_sad.gif" border="0" alt="" title=":(" class="inlineimg" />.text+0x11): undefined reference to `_GLOBAL_OFFSET_TABLE_'
    ld: kernel.o: in function `putcar':
    kernel.c<img src="images/smilies/icon_sad.gif" border="0" alt="" title=":(" class="inlineimg" />.text+0x8a): undefined reference to `_GLOBAL_OFFSET_TABLE_'
    ld: kernel.o: in function `_start':
    kernel.c<img src="images/smilies/icon_sad.gif" border="0" alt="" title=":(" class="inlineimg" />.text+0x15e): undefined reference to `_GLOBAL_OFFSET_TABLE_'

    Donc c'est plutôt bizarre.
    Donc si j'ai compris correctement ce que j'ai fait, j'arrive à compiler en 32 bits avec l'option -m32, mais je n'arrive par contre pas à linker de sorte à créer un fichier binaire pur (ne contenant pas les headers du fichier elf). Donc est ce qu'il existe des linkers dédiés au 32 bits ? Ou quelle option utiliser pour obtenir un code 32 bits ? Je sais que je peux utiliser le format elf_i386 pour obtenir un fichier elf 32 bits, mais lors des tests, ça plante, en raison (je pense) du fait que le fichier de sortie est un elf, et pas un binaire pur. L'erreur, sous virtual box, est la suivante (après démarrage correct du bootloader) :
    Une erreur critique est survenue pendant l'exécution de la machine virtuelle et cette dernière a été arrêtée.
    Sinon, quand je parle des headers, je ne parle pas des headers du C, mais de ceux utilisés dans le format elf (en début du fichier, indiquant les différents emplacements des sections, le type de fichier, etc). Mais au final, je pense que l'on ne les voit pas.
    Ensuite, il est possible que je n'ai pas compris les messages d'erreurs, alors si tu as une autre solution, je suis preneur aussi
    Sinon, pour les options Ttext etc, je m'en occupe

    EDIT : En fait, j'ai résolu mon problème : pour que tout marche correctement, il suffit d'utiliser l'option -m elf_i386 (pour indiquer que l'on travaille en 32 bits) avec --oformat binary (pour indiquer que l'on ne veux que du code binaire). Merci beaucoup pour ton aide en tout cas !

###raw>template_hook.ano_emploi###