Question

J'ai une petite solution de test avec un exe et trois DLL, l'exe appelant les trois DLL une fois chacune. J'ai réglé le Build-> Advanced-> Adresse de base DLL Réglage sur 0x41000000, 0x42000000 et 0x43000000 pour Dll1.dll, Dll2.dll et Dll3.dll respectivement. J'ai coulé

ngen install ConsoleApplication1.exe

Et cela a réussi à avoir réussi l'application avec les trois DLL. Je ne voulais pas vraiment ngen l'EXE, mais jusqu'à présent, c'est le seul moyen de produire des résultats du tout.

Au moment de l'exécution, j'utilise VMMAP pour surveiller l'espace d'adresse virtuel et il révèle que les DLL Ngen's sont assises dans une gamme cohérente de mémoire virtuelle, mais elles sautent toujours dans cette plage, chargeant à une adresse légèrement différente à chaque fois que je fonctionne leur. VMMAP révèle qu'il n'y a rien alloué aux adresses où j'essaie de charger les images, donc ce comportement nerveux n'est pas causé par les collisions d'adresses.

J'ai gardé des journaux:

   Dll1       Dll2       Dll3
0x40140000 0x411D0000 0x42810000 
0x40580000 0x41EB0000 0x426B0000 
0x40190000 0x41FB0000 0x42380000 
0x40F30000 0x41FD0000 0x42050000 
0x409B0000 0x41BF0000 0x42910000 
0x408E0000 0x41860000 0x42050000 
0x40B50000 0x41280000 0x42A80000

Notez que les deux premiers chiffres de l'adresse restent cohérents pour les trois DLL dans toutes les analyses.

Ma question réelle: est-ce un indicateur de succès? Je suis un peu confus parce que je pensais que les DLL allaient être assises exactement à 0x41000000, 0x42000000 et 0x43000000. Les résultats montrent qu'ils traînent dans cette zone, mais ne m'assement jamais là où je leur ai demandé de s'asseoir. Ma compréhension est que vous voulez que les DLL soient chargées exactement à l'adresse que vous leur demandez afin qu'ils n'aient pas à subir l'opération de rebasing coûteuse (qui est très Très cher lorsque vos DLL auront été ngentes). Mais n'est-ce pas exactement ce qui se passe? Bien sûr, mes DLL traînent dans une certaine zone, mais ils ne sont pas assis exactement là où je leur ai demandé de s'asseoir, donc sûrement l'opération de rebasing coûteuse est en cours de référence à chaque heure d'exécution? C'est exactement ce que je voulais éviter.

Remarque: je ne suis pas intéressé par les arguments pour / contre la rebasing et NGEN. Je veux juste savoir ce qui se passe et comment le faire fonctionner.

Bravo ainsi!

Était-ce utile?

La solution

Pourrait être ASLR (AddRes Space Layout Randomisation) - Consultez les liens depuis http://social.msdn.microsoft.com/forums/en/vcgeneral/thread/bac7e300-f3df-4087-9c4b-847880d625ad

Autres conseils

L'outil NGEN ne limite-t-il pas une adresse de base pour l'image binaire qu'il fait pour un assemblage. Afaik vous devez compiler «l'adresse de base préférée» dans l'assemblée elle-même. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

Éditer *

Cependant, si le chargeur ne peut pas placer le module à l'adresse souhaitée (car elle se chevauche avec un autre module ou des données déjà chargées ou allouées), le module est réprimandé, ce qui signifie qu'il est chargé à une autre adresse. Cela implique que toutes les adresses dans l'image exécutable doivent être corrigées.

En regardant également Internet, il semble que de nombreux développeurs souhaitent cette fonctionnalité, mais le problème est de réserver des adresses de base qui ne sont pas en conflit avec d'autres développeurs. Quelles autres DLL sont assis aux adresses que vous attendez du vôtre?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top