Compilation Visual C++ et Linkage DJGPP : pourquoi ca marche pas? - Programmation
Marsh Posté le 17-11-2001 à 18:21:09
hum, c'est pas toi qui fait un mini kernel ?
moi aussi j'ai bataille grave avec la compilation en un binaire avec gcc et ld pour windows (pas reussi mais sous Linux nickel )
je peux pas trop te repondre pour la gestion des obj avec VC++
moi je compilais en .com avec le Borland, mais c'est du 16 bits
surement connais tu deja ces sites mais au cas ou, voici une FAQ dediee a ce pblm
http://www.mega-tokyo.com/os/os-faq-linker.html
et plus generalement
http://www.mega-tokyo.com/os/os-faq.html
ce site super aussi :
http://www.nondot.org/sabre/os/articles
avec
http://www.nondot.org/sabre/os/art [...] leFormats/
et surtout
http://www.nondot.org/sabre/os/fil [...] mpiler.pdf
autre mega site:
http://www.execpc.com/~geezer/os/
quand j'ai arrete le "developpement" de mon micro mini "noyau", j'en etais a voire s'il etais envisageable de compiler simplement mon code sous VC++ et creer un exe windows, mais avec une astuce a savoir un truc du genre:
winmain(....)
{
long 0x12345678;
EntryPoint();
}
et mon programme de boot scanne cet exe a la recherche de ce nombre et fait un jump juste derriere
tu peux essayer ...
bon courage
Marsh Posté le 17-11-2001 à 18:30:54
Oula la technique de fou!!!
J'y aurais jamais pensé! C'est assez astucieux faut reconnaitre!
Car le linker de ms n'a pas été prévu pour le flat binary...
C'est bien moi qui fait un mini-kernel
Comme toi je galere grave avec ce linkage...Je pense que ta méthode, je vais l'essayer mais plutot que d'utiliser une astuce comme celle ci je vais améliorer le truc en créant un programme qui extrait de l'executable le code généré.
Mon programme de boot n'en est pas encore au point de savoir lire un fichier sur le disque dur
Faut avouer que c'est bizzare quand meme ce probleme...
Merci pour tes addresses, j'ai pas encore eu le temps de tout voir, mais je crois que finalement la seule bonne méthode c'est la méthode maison... Quoique le probleme c'est que le linker de ms a une facheuse tendance a rajouter plein de code inutile dans le programme
[edtdd]--Message édité par Ace17--[/edtdd]
Marsh Posté le 17-11-2001 à 18:40:55
ben moi mon prog de boot je me suis pas fait chier
comme ca me gavais d'attendre la lecture de la diskette, c long, ca fouarre des fois et pas envie de me faire chier avec Bochs
je m'etais fait un petit prog DOS, "loader", qui me chargeais toute mon image en C700 je crois, comme un vrai boot
du coup, pas de lecture disque, tout est en memoire
Marsh Posté le 17-11-2001 à 19:05:23
Ouais mais ca résoud pas le probleme des librairies run-time que le compilo de MS va greffer a l'executable, dans la section de code
Marsh Posté le 17-11-2001 à 19:21:16
je vois pas trop de quoi tu parles
on s'en fout un peu de ce qu'il fait
Code :
|
ca compile ca non ?
ben ton loader, il scan l'executable obtenu a la recherche de 0x12345678 et fait un jump juste apres.
a mon avis, la difficulte est de creer des descripteurs corrects, a savoir comme le ferait windows
et pour ca faut etudier le format PE et c'est ca qui m'a rebute
Marsh Posté le 17-11-2001 à 19:34:13
au passage je vous fait part d'une astuce interressante pour reduire la taille du code genere sous VC++ decouverte ici :
http://www.codeproject.com/tips/reducesixeexe.asp
un source tel que celui au dessus peut etre reduit a ... 3 Ko !!
mais y'a bien sur un hic : il utilise une dll de 250 Ko (c ca le run time dont tu parles ?)
ben alors tu peux tjts te contenter de 15 Ko, sans run time (sans la dll)
faut pas linker avec MSVCRT.LIB pour ca
mais sinon, je pense que l'exe de 3 Ko peut etre exploitable dans ton cas
dessassemble le
tu vas voir, y'a plein d'appels a la dll MSVCRT machin, mais recherche l'occurence 0x12345678 et ho joie miracle félicité, tu trouves ton code, nickel, dans un exe a peine plus gros qu'un prog en assembleur !
donc si tu te demerdes pour faire un jump a cet endroit, hop, le tour est joué, a conditions d'avoir des selecteurs valides (je pense)
tu vois, pas besoin de "programmes d'extraction de code genere", link avec kernel32.lib, user32.lib, MSVCRT.LIB en ignorant les lib par defaut et ajoute l'option /ALIGN:4096 le tout en release biensur, et t'obtient un mini exe, avec du code optimisé !
si jamais t'arrives a faire ca, mail moi
hello-world.fr@caramail.com
Marsh Posté le 17-11-2001 à 19:41:34
Ca c'est bon le format PE je le connais assez bien pour avoir écrit des virus....a titre éducatif evidemment
Non mon probleme c'est que j'aimerais bien avoir un code généré propre...C'est a dire que je ne veux pas me retrouver avec les 3/4 du code occupé par des GetModuleHandle et GetVersion divers surs lesquels on tombe quand on désassemble
Marsh Posté le 17-11-2001 à 19:46:17
ben test ca et tu va voir
y'a qq appels du genre MSVCRT:WinMain
mais sur 3Ko, t'imagines bien que c'est assez reduit
passé ces quelques appels, tu obtiens ton code a toi, "propre"
par contre une autre voie que j'ai pas trop exploré faute de connaissance est l'option de creer une dll
dans une dll, y'a que ton code ?
Marsh Posté le 19-11-2001 à 19:23:10
Je sais pas si dans une DLL y'a que mon code, faudra que j'essaie...
Sinon j'ai fait quelques tests, apparament il fout le code utilisateur au début de la section, il colle ensuite les morceaux de runtime APRES, a partir de l'entry point. Donc ca s'annonce pas trop mal de séparer les deux. Je vais commencer a coder un extracteur
PS : Ok, je te maile quand j'y arrive!
[edtdd]--Message édité par Ace17--[/edtdd]
Marsh Posté le 19-11-2001 à 21:59:56
J'ai essayé la DLL, raté; Y'a aussi du code runtime
Je vais me rabattre sur l'executable. Mais en fait, c'est la meme chose de toutes facons : c'est le meme format a l'intérieur
Marsh Posté le 22-11-2001 à 03:31:50
J'avais ce tip dans mes sources, je sais pas si ca convient a ton cas.
Pour pas linker une dll avec le runtime VC++, il faut proceder comme suit (ca presuppose que tu as defini un point d'entree, DllMain(), dans ton code):
Code :
|
Une autre technique possible:
Passer explicitement au linker (VC++) le point d'entree de sa Dll par l'option /Entry:nom_de_la_fonction_point_d_entree
ce point d'entree doit avoir un prototype identique a ceux de DllMain ou _DllMainCRTStartup files ci dessus.
(on joue sur le fait qu'elles ont le meme proto pour virer _DllMainCRTStartup)
Windows encapsule l'appel a la Dll avec une paire de messages: DLL_PROCESS_ATTACH et DLL_PROCESS_DETACH. Mais si l'appel avec DLL_PROCESS_ATTACH a retourne FALSE, il n'y aura pas d'appel avec DLL_PROCESS_DETACH.
(les deux autres messages envoyes a _DllMainCRTStartup sont DLL_THREAD_ATTACH et DLL_THREAD_DETACH, mais je pense pas que cela ait de l'importance dans ton cas).
Pour le role de DllMain, voir ici: http://msdn.microsoft.com/library/ [...] l_8asu.asp
A+,
[edtdd]--Message édité par gilou--[/edtdd]
Marsh Posté le 22-11-2001 à 17:44:05
C'est bon merci du tuyau mais j'ai codé un début d'extracteur ca marche assez bien
Mais je vais l'améliorer un peu.
N'empeche c'est un bon truc, désormais y'a vraiment QUE mon code dans mon programme, ca fait vraiment plus propre.
[edtdd]--Message édité par Ace17--[/edtdd]
Marsh Posté le 23-11-2001 à 20:57:22
Au fait tant qu'on y est personne ne sait comment on dit au compilateur de Visual C++ de placer le code et les données dans la meme section?
Marsh Posté le 23-11-2001 à 23:14:33
la il faut que tu regardes la doc du linker, je pense.
Vas voir ce lien: http://msdn.microsoft.com/library/ [...] frame=true (ce qui correspond aux .def) et aussi ce lien: http://msdn.microsoft.com/library/ [...] erence.asp
Notes que si c' est du COFF, tu peux jeter un oeil a editbin.exe: http://msdn.microsoft.com/library/ [...] erence.asp
( et voir ce que tu generes actuellement avec dumpbin.exe : http://msdn.microsoft.com/library/ [...] erence.asp )
A+,
[edtdd]--Message édité par gilou--[/edtdd]
Marsh Posté le 24-11-2001 à 18:47:11
Ca y est l'extracteur fonctionne!
Par contre j'ai toujours pas trouvé comment mettre les données du prog dans la meme section que le code
[edtdd]--Message édité par Ace17--[/edtdd]
Marsh Posté le 17-11-2001 à 17:26:52
Il me semble que le compilo de Visual C++ il génere des fichiers obj au format COFF non? Je peux pas linker avec Visual parce que je veux un format de sortie binaire : sans en-tete quoi.
Et donc tout semble marcher normalement, le linkage et la compilation se passent sans probleme, mais il y a un truc qui me dérange. Voici mon code pour le moment :
main.cpp
void MyMain();
void EntryPoint()
{
MyMain();
}
void Dummy()
{
int a = 54;
int b = 54 * a;
}
void MyMain()
{
Dummy();
while(1);
}
Or il se trouve que les instructions CALL ne sont pas correctement crées. En effet quand je désassemble le résultat tous les calls sont sous la forme E8 00 00 00 00
Ca veut dire, que on ne saute nulle part, si ce n'est a la ligne suivante... Ou est-ce que je me suis trompé?