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 :

Linkage 32 bits


Sujet :

Programmation d'OS Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Juillet 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juillet 2020
    Messages : 14
    Points : 6
    Points
    6
    Par défaut 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 :
    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 :
    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 sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 214
    Points : 10 140
    Points
    10 140
    Par défaut
    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 :

    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
    Homme Profil pro
    autre
    Inscrit en
    Juillet 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juillet 2020
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    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:x86-64 output
    ld: kernel.o: in function `scrollup':
    kernel.c:(.text+0x11): undefined reference to `_GLOBAL_OFFSET_TABLE_'
    ld: kernel.o: in function `putcar':
    kernel.c:(.text+0x8a): undefined reference to `_GLOBAL_OFFSET_TABLE_'
    ld: kernel.o: in function `_start':
    kernel.c:(.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 !

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

Discussions similaires

  1. Linkage 64 bits
    Par jkalzsmu dans le forum Visual Studio
    Réponses: 2
    Dernier message: 02/07/2008, 09h27
  2. Main icon (16 bits)
    Par DR dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/09/2002, 08h23
  3. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  4. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34
  5. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31

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