Virer la CRT

Résolu
Signaler
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011
-
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011
-
Bonjour,

J'essaye de virer la C Run Time de mon prog en suivant la procédure suivante :
(sous Visual C++)

- Sous Linker/Input, "Ignore All Default Libraries" => Yes
- C/C++/Code Generation, "Buffer Security Check" => No
- Linker/Advanced, "Entry Point" => MyWinMain

Avec ça j'ai 2 erreurs de linkage sur memset et chkst qui sont 2 fonctions que je n'utilise pas dans mon prog.
En fait dans mon MyWinMain j'appel juste une boite de dialogue et j'ai l'impression que c'est l'appel à la fonction DialogBox qui cause l'erreur car quand je vire cet appel je n'ai plus d'erreur.
J'ai vu dans le code de BruNews qu'il utilisait uniquement de l'ASM dans son Main pour faire l'appel à la fonction DialogBoxParam, moi je n'ai utilisé que du c++, si l'erreur viens de la, faut il obligatoirement utiliser de l'ASM dans le Main pour virer la CRT ?

16 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
"Ignore All Default Libraries" remet le à No
Va dans C/C++->Génération de code->"Bibliothèque Runtime" et change pour Multithread
Change aussi "Vérification de la sécurité de la mémoire tampon" pour non

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
ASM pas obligatoire, c'est juste pour éviter la stackframe d'entrée qui ne sert à rien.
Pour virer CRT, suffit de cela:

#pragma comment(linker, "/entry:myWinMain")
void __stdcall myWinMain()
{
  // TON CODE ICI
 
  ExitProcess(0); // SORTIR ICI
}

warnings "CRT section exists" dit que des 'memset' ou autres trucs de ce genre ont été insérés.
Souvent dus à ce genre de code:
UNESTRUCT t = {0};
tu vires et tu initialises membre à membre.

ciao...
BruNews, MVP VC++
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Merci beaucoup [auteurdetail.aspx?ID=617077 SAKingdom]ça compile, en fait c'était le

"Ignore All Default Libraries" à mettre à NO sinon le reste c'était bon.
Par contre j'ai 2 Warnings :

1>LIBCMT.lib(mathfcns.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
1>LIBCMT.lib(cpu_disp.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

Ta pas une idée de ce que ça veux dire?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Je pense que pour pouvoir virer complétement la CRT il faut travailler en C pur (pas de C++). Voici un exemple de code source avec les options de compilation et linkage que tu peux examiner: Indicateur RAM

Voici un petit débat qui devrait t'interesser: ICI
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Merci les gars,
j'ai trouvé la fonction qui était a l'origine des warning...ZeroMemory...
J'ai mis SecureZeroMemory à la place et plus de warning.
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Ok merci racpp je vais jeter un oeil la dessus, tout ce qui est optimisation de code m'interresse
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

Bonsoir,

Juste pour ajouter de la precision la doc dit :
The /NODEFAULTLIB option tells the linker to remove one or more default libraries from the list of libraries it searches when resolving external references.
[...]
If you use /NODEFAULTLIB, for example, to build your program without the C run-time library, you may have to also use /ENTRY to specify the entry point (function) in your program.
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Euh juste une question BruNews, quand tu fait ça :

#pragma comment(linker, "/entry:myWinMain")
void __stdcall myWinMain()
{
  // TON CODE ICI
 
  ExitProcess(0); // SORTIR ICI
}

Pourquoi mettre un ExitProcess(0) à la fin ? un simple return ne ferait pas l'affaire ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
return v;
c'est CRT qui assure ExitProcess(v) pour quitter.
Gaffe que sans CRT le prog restera en mémoire dans de nombreux cas sans appel explicite ExitProces().

ciao...
BruNews, MVP VC++
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Ok ça marche merci.
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

J'ai un doute sur les fonctions GlobalAlloc et CopyMemory, se sont bien des API WIN32 ? ou alors c'ést lié a la CRT ? parce que la j'ai le fameux message d'erreur : "warning LNK4210: .CRT section exists;" et quand je vire l'une ou l'autre de ces 2 fonction plus de message, cela dit la fonction CopyMemory est présente à plusieurs endroits de mon application et ne cause pas de problème, je ne pense pas que ça soit elle le problème.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
GlobalAlloc est à considérer comme obsolète (hors pour le clipboard, encore que...). Il faut remplacer par VirtualAlloc.

CopyMemory est toujours remplacé par la macro CRT memcpy sur VC++ pour raisons de perfs.

ciao...
BruNews, MVP VC++
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Oui justement c'est pour le ClipBoard que je l'utilise, c'est donc CopyMemory qu'il faut virer...c'est bizar qu'il me mette pas le message "warning LNK4210" alors que je l'ai utilisée a plusieurs reprises. Idem pour SecureZeroMemory, et toutes les fonctions associées ?
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Faut que je code une fonction maison ou il y a une API pour remplacer memcpy ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Tu ne vas quand meme pas faire un appel externe pour une copie mémoire ???

On va copier une struct dans un autre buffer:
DWORD *c, *d, len;
len = sizeof(BNSTRUCT) / 4; // par DWORDs
c = (DWORD*) &bnstruct;
c = (DWORD*) buffer;
do {
  *d++ = *c++;
} while(--len);

sur ce principe pour toute copie mémoire.

ciao...
BruNews, MVP VC++
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

"

Tu ne vas quand meme pas faire un appel externe pour une copie mémoire ???"

Euh...si pourquoi? j'aime pas la redondance de code (et je suis fénéant ).

Ok merci pour le bout de code.