Accueil > Forum > > > > GCC et msvcrt.dll
GCC et msvcrt.dll
lundi 13 septembre 2004 à 21:50:42 |
GCC et msvcrt.dll

Nebula
|
Je viens de faire une remarque pour le moins préoccupante... J'utilise GCC (3.4.2) pour compiler des applications Win32, et j'ai remarqué en dumpant les exécutables générés qu'il y avait toujours des imports provenant de msvcrt.dll, alors que je n'utilise QUE des fonctions de l'API ! Par exemple, ce bête code #include <windows.h>
INT WINAPI WinMain(HINSTANCE Instance, HINSTANCE PrevInstance, LPTSTR CmdLine, INT CmdShow) { return 0; } |
compilé ainsi | gcc -s toto.c -o toto.exe -mwindows |
a les imports suivants : DLL Name: msvcrt.dll vma: Hint/Ord Member-Name Bound-To 51a8 39 __getmainargs 51b8 60 __p__environ 51c8 62 __p__fmode 51d8 80 __set_app_type 51ec 121 _cexit 51f8 233 _iob 5200 350 _onexit 520c 388 _setmode 5218 533 abort 5220 540 atexit 522c 560 fflush 5238 569 fprintf 5244 575 free 524c 626 malloc 5258 656 signal | Le plus bizarre étant que lorsque je désassemble WinMain avec GDB, j'obtiens ce code, parfaitement clean : (gdb) disassemble WinMain Dump of assembler code for function WinMain: 0x401290 <WinMain>: push ebp 0x401291 <WinMain+1>: mov ebp,esp 0x401293 <WinMain+3>: mov eax,0x0 0x401298 <WinMain+8>: pop ebp 0x401299 <WinMain+9>: ret 0x10 End of assembler dump. |
Aucune référence aux fonctions sus-nommées, donc... Y'a t'il un moyen de faire sauter çà (où de trifouiller la table d'imports pour vérifier si ces fonctions sont bien utilisées) ? Je savais que GCC s'appuyait sur cette DLL pour les applications console, mais j'ignorais que çà concernait aussi Win32...
|
|
lundi 13 septembre 2004 à 22:26:58 |
Re : GCC et msvcrt.dll

BruNews
|
Salut Nebula, oui pas normal du tout, un prog GUI ne devrait avoir de references que sur le kernel win32.
ciao... BruNews, MVP VC++
|
|
lundi 13 septembre 2004 à 22:32:46 |
Re : GCC et msvcrt.dll

Nebula
|
Salut BruNews :) J'ai trouvé ce qui clochait, en fait WinMain est localisée en 0x00401290 et le programme démarre en 0x00401240, qui correspond à ceci : (gdb) disassemble 0x00401240 Dump of assembler code for function WinMainCRTStartup: 0x401240 <WinMainCRTStartup>: push ebp 0x401241 <WinMainCRTStartup+1>: mov ebp,esp 0x401243 <WinMainCRTStartup+3>: sub esp,0x8 0x401246 <WinMainCRTStartup+6>: mov DWORD PTR [esp],0x2 0x40124d <WinMainCRTStartup+13>: call ds:0x4050e0 0x401253 <WinMainCRTStartup+19>: call 0x401100 <__mingw_CRTStartup> 0x401258 <WinMainCRTStartup+24>: nop 0x401259 <WinMainCRTStartup+25>: lea esi,[esi*1] End of assembler dump. |
Je change de compilateur, à moins de trouver une alternative à ce caca... Dommage.
|
|
lundi 13 septembre 2004 à 22:41:40 |
Re : GCC et msvcrt.dll

BruNews
|
Rien de tel que VS pour compiler du Windows.
ciao... BruNews, MVP VC++
|
|
mardi 14 septembre 2004 à 00:36:48 |
Re : GCC et msvcrt.dll

Nebula
|
Bon j'ai trouvé un truc TRES intéressant : gcc -g toto.c -o toto -nostartfiles -mwindows C:\GCC\BIN\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: warning: cannot find entry symbol _WinMainCRTStartup ; defaulting to 00401000 |
Avec cette option -nostartfiles, on zappe msvcrt.dll et le code d'initialisation de la CRT, en gagnant 3Ko en prime... Le warning sur la fonction introuvable peut être ignoré en paix, j'ai vérifié avec GDB, la nouvelle adresse correspond à celle de WinMain. Pas besoin de changer mes habitudes, donc :-)
|
|
mardi 14 septembre 2004 à 00:56:49 |
Re : GCC et msvcrt.dll

BruNews
|
Alors j'ajoute: rien de tel que Nebula !!!
ciao... BruNews, MVP VC++
|
|
mardi 14 septembre 2004 à 02:36:10 |
Re : GCC et msvcrt.dll

Nebula
|
J'ai parlé trop vite : çà fonctionne très bien sur ce code simpliste, mais aucune de mes applis ne veut plus compiler après...
J'ai lancé un thread sur le forum de MinGW, on verra bien s'ils ont une solution (l'url pour ceux que çà pourrait intéresser : http://sourceforge.net/forum/forum.php?thread_id=1144206&forum_id=7134 )
|
|
mardi 14 septembre 2004 à 21:07:19 |
Re : GCC et msvcrt.dll

Nebula
|
Réponse acceptée !
Allez, j'ai fini par arriver à une solution pleinement satisfaisante, sans même devoir recompiler le compilateur : il suffit de jouer sur les bonnes options (et de lire les sources pour trouver ce qui est exploitable)...
Donc, comment se passer de MSVCRT.DLL avec MinGW et générer du code Win32 natif (allégé de 5Ko en prime): 1) compiler avec les options suivantes: -nostartfiles -nodefaultlibs -nostdlib 2) remplacer "int main(void)" par "void mainCRTStartup(void)" "int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)" par "void WinMainCRTStartup(void)" "BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)" par "BOOL WINAPI DllMainCRTStartup(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)" 3) pour avoir à nouveau argv et lpCmdLine, utiliser GetCommandLine 4) pour avoir les HCONSOLE de stdin/out/err, utiliser GetStartupInfo 5) pour printf et assimilées, utiliser FormatMessage et/ou WriteConsole (WriteFile pour les fichiers) 6) l'import automatique de kernel32/user32 étant désactivé, il faudra les lier manuellement 7) et voilà ! çà devrait fonctionner pour d'autres compilateurs (testé sur MSVC++ 6.0)
Bien sûr, aucune fonction de la CRT ne doit être utilisée, puisqu'elle n'est plus initialisée (memset semble marcher convenablement, toutefois)... Et il faut utiliser ExitProcess pour retourner le code d'erreur !
|
|
mardi 14 septembre 2004 à 21:13:11 |
Re : GCC et msvcrt.dll

BruNews
|
Ben faut vraiment avoir envie...
ciao... BruNews, MVP VC++
|
|
mardi 14 septembre 2004 à 21:53:55 |
Re : GCC et msvcrt.dll
|
Cette discussion est classée dans : code, gcc, dll, msvcrt, winmain
Répondre à ce message
Sujets en rapport avec ce message
GCC : Linker sans la casse [ par LandTech ]
Bonjour, J'aimerais que quand je compile un code en asm, du genre : [code=autre] .section .text .balign 16 .globl _WINMAIN@16 _WINMAIN@16: ret [/cod
Code::Block DLL pour l'utiliser dans VB [ par runo ]
Bonjour, je souhaite créer une DLL en C (ou C++) avec Code::Block que j'utiliserai ensuite sous VB (en fait excel 2003)... Je crée donc mon projet DL
appeler une fonction c++ contenu dans dll avec de code c++ [ par avg ]
j'ai une fonction qui est sous une class dans un dll déclarer comme ce ci : [code=cpp]C_MORPHO_User::C_MORPHO_User()[/code] j'ai appeler dll avec Load
CLR - Utiliser CString et System::String^ [ par phantom_2005 ]
Bonjour à tous, j'ai créé une dll managée C++ (VS2005) pour utiliser avec une application C#. Cette Dll managée charge statiquement une dll non manag
fonction dans dll qui fait planter programme [ par pitch069 ]
Bonjour,je travail actuellement sur un code C++, sous dev c++. j'utilise une dll au travers d'un *.lib et dans mon programme principal je fais appel a
Le nouveau GCC et le problème avec iostream.h [ par zaim khelifi ]
Bonjour à tous; Dernièrement, avec le nouveau compilateur GCC 4.3, lorsqu’on compile :[code=cpp] #include int main() { cout<<"Hello Monde\n"; } [/cod
.dll [ par dhahrikhedher ]
comment ajouté un dll[code=cpp][/code]avec visual studio
Impossible d'obtenir l'adresse d'une function contenus dans une DLL [ par Nementon ]
Bonjours, Voila le code simple d'une DLL et de son exécutable, compilé sous Visual 2008 et qui pour de sombres raisons plante lamentablement, lorsqu
Dll, resource .h et .rc [ par wxccxw ]
Bonjour, Je souhaite utiliser une dll pour creer un dialog box. j'ai creer une dll deja dans laquelle j'ai deja [code=cpp]extern "C" __declspec(dllex
Modifier un code utilisant une lib statique [ par andrebernard ]
Bonjour à tous Je suis debutant, et j'ai trouvé ce code pour apprendre, sur un site de Microsoft qui montre comment modifier en C une structure envoy
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|