[MinGW] Virer les dependances au CRT

Résolu
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 11 août 2007 à 15:30
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 15 août 2007 à 11:59
Bonjour,
Est-ce que quelqu'un saurait comment virer les depences au crt ds une dll?
Je ne les utilises pas, mais j'ai quand mm des apelles a malloc, free, fprintf, fflush, abort, _iob, _errno, __dllonexit
Surement a cause du point d'entré que le linker redefini a DllMainCRTStartup, j'ai essayer ca:
--entry=DllMain
--nostdlibs
-lkernel32
-lntdll
mais a la compilation je me retrouve avec cette erreur:[Warning] cannot find entry symbol DllMain; defaulting to 65581000
J'ai aussi essayer de refaire la fonction DllMainCRTStartup:
int APIENTRY DllMainCRTStartup(void)
{
return 1;
}
mais elle semble etre ignoré
Si quelqu'un a une solution...

Neo_Fr

39 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 août 2007 à 14:05
Je n'ai jamais compilé de DLL avec MinGW, je ne suis donc pas sur de moi, mais la ligne de commande suivante fonctionne bien chez moi :

gcc -c test.c -o test.o
g++ -s test.o -o test.dll -mwindows -nostdlib -luser32 -lkernel32 -lcomctl32

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 août 2007 à 14:36
gcc -c test.c -o test.o
gcc -s test.o -o test.dll -mwindows -nostdlib -luser32 -lkernel32 -lcomctl32

Ca marche aussi

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 22:43
Je n'utilise pas mingw mais il y a un trux que je trouve bizarre dans ton affaire.
La DllMain() prend 3 params que le SYSTEME aura mis sur la pile et non le CRT, il faut dans tous les cas les dépiler.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 22:46
les depiler comment? avec __stdcall?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 22:50
__stdcall toujours.
Si ta fonction est codée en C, il suffit de mettre les 3 params à ta fonction, le compilo assure le dépilage en sortie de fonction.
En ASM, sortir par: ret 12

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:00
Je ne comprend pa bien ce que tu trouve bizare
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:07
int APIENTRY DllMainCRTStartup(void)

je ne vois pas les 3 params. (HINSTANCE hdll, DWORD dwReason, LPVOID Reserved)

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:14
Quand je compile le linker "creer" une nouvelle fonction DllMainCRTStartup qui apelle elle meme DllMain en se servant de fonction issue des crt.
J'ai donc essayer de mettre cette fonction ds mon code pour qu'il utilise ma fonction a la place de la creer lui meme, mon pb c'est qu'il ne la prend pa en compte
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:16
Sinon mon DllMain est bien comme le tien:
int APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
return 1;
}
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:23
Question subsidiare:
pourquoi ne pas employer les outils MS pour produire du code tournant sur MS ???

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:25
Je crois que j'ai compris ce que tu voulais dire:


int APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
return 1;
}

int APIENTRY DllMainCRTStartup(HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
int Ret = DllMain(hInst, reason, reserved);
return Ret;
}

C mieux?

Maintenant j'ai le droit a: multiple definition of `DllMainCRTStartup@12'
Il y a t-il un moyen de redefinir ma fonction a la place de celle utiliser produit par le linker?
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:27
J'ai essayer de le compiler avec VC2003 et VCE2005 mais je me retrouve avec 408 erreur! :S alors que ce meme code compile parfaitement avec devcpp
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:30
SUR que c'est mieux !!!

par contre je ne verrai pas trop l'utilité de rempiler vers un DllMain(), autant traiter en local.

Avec VC++ oui tu peux redéfinir, il y a des codes (vecchio et nebula, autres ?) sur cppfrance en démo.
mingw aucune idée.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:33
Sur VC++

#pragma comment(linker, "/entry:myDllMain")
int __stdcall myDllMain(HINSTANCE hdll, DWORD dwReason, LPVOID Reserved)
{
  return 1;
}

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:35
C'est l'equivalent de --entry=myDllMain avec mingw, le pb est qu'il me sort ca:
[Warning] cannot find entry symbol DllMain; defaulting to 65581000
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:39
je te dirais bien "vire le" mais...

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:41
virer quoi?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:46
le compilo qui ne veut pas, pardi.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:48
si ten connait un autre capable de compiler mon code:S, pas de pbs alors=)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2007 à 23:50
Jamais vu VC++ refuser de compiler du code Windows.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous