Virer la CRT

Résolu
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 22 juin 2007 à 14:51
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 25 juin 2007 à 21:54
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 juin 2007 à 16:54
"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++ (@++)<!--
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 juin 2007 à 17:58
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++
3
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
22 juin 2007 à 17:35
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?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 juin 2007 à 18:27
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
0

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

Posez votre question
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
22 juin 2007 à 18:54
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.
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
22 juin 2007 à 18:58
Ok merci racpp je vais jeter un oeil la dessus, tout ce qui est optimisation de code m'interresse
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
22 juin 2007 à 23:03
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.
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
25 juin 2007 à 11:05
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 ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 juin 2007 à 11:56
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++
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
25 juin 2007 à 12:04
Ok ça marche merci.
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
25 juin 2007 à 21:09
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 juin 2007 à 21:20
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++
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
25 juin 2007 à 21:25
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 ?
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
25 juin 2007 à 21:26
Faut que je code une fonction maison ou il y a une API pour remplacer memcpy ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 juin 2007 à 21:41
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++
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
25 juin 2007 à 21:54
"

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.
0
Rejoignez-nous