Compiler un code C.

Résolu/Fermé
_benjamindu11_ - 10 sept. 2012 à 20:59
0x40 Messages postés 65 Date d'inscription vendredi 7 septembre 2012 Statut Membre Dernière intervention 14 septembre 2012 - 11 sept. 2012 à 23:41
Bonjour,

Il y a peu, j'ai décidé de créer mon propre système d'exploitation.
J'ai codé mon propre secteur de boot (codé en assembleur) qui passe en mode protégé.

Mais aujourd'hui j'ai attaqué le noyau, en C, avec Code::Blocks.

J'ai choisi GCC comme compilateur.

J'aimerais pouvoir décaler les adresses dans le code de 0x1000 (car mon boot charge le noyau en 0x1000 dans la RAM), et avoir en sortie un fichier qui ne contient que les instructions binaires à exécuter.

En clair je ne veux pas de fichier .EXE, je veux un fichier contenant du code machine brut.

Comment obtenir cela à partir de Code::Blocks ?

Merci d'avance pour vos réponses !

A voir également:

4 réponses

_benjamindu11_
11 sept. 2012 à 13:44
Up...
0
0x40 Messages postés 65 Date d'inscription vendredi 7 septembre 2012 Statut Membre Dernière intervention 14 septembre 2012 41
11 sept. 2012 à 13:48
Je trouve vote sujet très interressant lors de la compilation des fichiers .o (objets) sont générés ! Ce sont eux qui contiennent la traduction du code en langage machine.

En théorie si je ne dis pas de bétises il vous suffit de récupérer leur contenu !
0
_benjamindu11_
11 sept. 2012 à 20:26
Non, j'ai essayé ceci et... La machine virtuelle a planté. Le curseur bougeait dans tous les sens.

J'ai donc fait autrement :
- J'ai installé VirtualBox (en plus de Virtual PC !) pour la rapidité.
- J'ai installé Ubuntu 12.04 sur une machine virtuelle VBox.
- J'ai effectué les mises à jour.
- J'ai installé nasm (sudo apt-get install nasm)
- J'ai compilé mon code :
gcc -c kernel.c (fichier qui contient le code du noyau)
gcc -c scrnfnc.c (fichier qui contient la fonction "print" qui affiche le texte ;))
ld -o kernel --oformat binary -Ttext 1000 kernel.o scrnfnc.o


J'ai obtenu un fichier kernel sans extension (comme voulu.)
J'ai ensuite compilé mon secteur de boot via nasm :

nasm bootsect.asm -o bootsect


J'ai obtenu un fichier bootsect sans extension (comme voulu.)
J'ai ensuite utilisé WinImage pour créer une image disquette vierge, dans laquelle j'ai remplacé les octets de 0 à 0x4214 en suivant ceci :

0x0 - 0x200 : bootsect
0x200 - 0x4214 : kernel

Mon noyau pesait 0x4014 octets (hexadécimal) si mes souvenirs sont bons ;)

J'ai testé mon image disquette dans une machine virtuelle Virtual PC et là... Miracle, mon secteur de boot s'est exécuté sans aucun problème et mon noyau a chargé la GDT sans aucun problème.

Bref je suis content :D
0
0x40 Messages postés 65 Date d'inscription vendredi 7 septembre 2012 Statut Membre Dernière intervention 14 septembre 2012 41
11 sept. 2012 à 23:41
C'est toi qui à crée le sujet mais je tiens tout de même à te remercier pour tes explications claires et simples qui m'ont appris quelque chose de nouveau :)

Sinon si ton problème est résolut passe le sujet en résolut.

0x40
0