Domanda

Ho una piccola soluzione di prova con un EXE e tre DLL, l'EXE che chiama le tre DLL una volta ciascuna. Ho impostato il Build-> avanzato-> indirizzo base DLL Impostazione su 0x41000000, 0x42000000 e 0x43000000 per dll1.dll, dll2.dll e dll3.dll rispettivamente. Ho corso

ngen install ConsoleApplication1.exe

E questo ha con successo l'applicazione insieme alle tre DLL. Non volevo davvero Ngen the Exe, ma finora questo è l'unico modo per produrre risultati.

In fase di esecuzione utilizzo VMMAP per monitorare lo spazio degli indirizzi virtuali e rivela che le DLL Nen'd sono sedute all'interno di una gamma costante di memoria virtuale, tuttavia stanno ancora saltando in quella gamma, caricando a un indirizzo leggermente diverso ogni volta che eseguo correndo loro. VMMAP rivela che non c'è nulla allocato agli indirizzi in cui sto cercando di caricare le immagini, quindi questo comportamento nervoso non viene causato dalle collisioni degli indirizzi.

Ho tenuto i tronchi:

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

Si noti che le prime due cifre dell'indirizzo rimangono coerenti per tutte e tre le DLL in tutte le corse.

La mia vera domanda: è un indicatore di successo? Sono un po 'confuso perché pensavo che le DLL fossero sedute esattamente a 0x41000000, 0x42000000 e 0x43000000. I risultati mostrano che si aggirano in quella zona, ma non si siedono mai dove ho chiesto loro di sedersi. La mia comprensione è che vuoi che le DLL siano caricate esattamente all'indirizzo che chiedi loro in modo che non debbano sottoporsi alle costose operazioni di ribase molto molto costoso quando le tue dll sono state ngen'd). Ma non è esattamente quello che sta succedendo? Certo, le mie DLL sono in giro in una determinata area, ma non sono seduti esattamente dove ho chiesto loro di sedersi, quindi sicuramente l'operazione di ribase costosa viene popolata ad ogni tempo di esecuzione? Questo è esattamente quello che volevo evitare.

Nota: non sono interessato agli argomenti per/contro il rebasing e Ngen. Voglio solo sapere cosa sta succedendo e come farlo funzionare.

Saluti!

È stato utile?

Soluzione

Potrebbe essere ASLR (randomizzazione del layout spaziale addre) - controlla i collegamenti da http://social.msdn.microsoft.com/forums/en/vcgeneral/thread/bac7e300-f3df-4087-9c4b-847880d625ad

Altri suggerimenti

Lo strumento NGEN non limita a specificare un indirizzo di base per l'immagine binaria che crea un gruppo. Afaik devi compilare il "indirizzo base preferito" nell'assemblaggio stesso. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

Modificare *

Tuttavia, se il caricatore non è in grado di posizionare il modulo all'indirizzo desiderato (poiché si sovrappone con un altro modulo o un pezzo di dati già caricati o allocati), il modulo viene ribellato, il che significa che viene caricato ad un altro indirizzo. Ciò implica che tutti gli indirizzi all'interno dell'immagine eseguibile devono essere risolti.

Anche guardando su Internet sembra che molti sviluppatori desiderano questa funzione, ma il problema sta riservando gli indirizzi di base che non sono in conflitto con gli altri sviluppatori. Quali altre DLL sono sedute agli indirizzi in cui ti aspettavi che fosse il tuo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top