Pregunta

Tengo una pequeña solución de prueba con un exe y tres dlls, el exe llamando a las tres DLL una vez cada uno. He establecido el Build-> Avanzado-> Dirección base de DLL Configuración en 0x41000000, 0x42000000 y 0x43000000 para dll1.dll, dll2.dll y dll3.dll respectivamente. He corrido

ngen install ConsoleApplication1.exe

Y esto ha sido exitoso a NGEN la aplicación junto con las tres DLL. Realmente no quería NGEN el EXE, pero hasta ahora esta es la única forma de producir resultados.

En tiempo de ejecución, uso VMMAP para monitorear el espacio de direcciones virtuales y revela que las DLL de NGEN'D están sentadas dentro de un rango constante de memoria virtual, sin embargo, todavía están saltando dentro de ese rango, cargando en una dirección ligeramente diferente cada vez que ejecuto a ellos. VMMAP revela que no hay nada asignado en las direcciones donde estoy tratando de cargar las imágenes, por lo que este comportamiento nervioso no es causado por colisiones de direcciones.

He estado guardando registros:

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

Observe que los dos primeros dígitos de la dirección siguen siendo consistentes para las tres DLL en todas las ejecuciones.

Mi pregunta real: ¿Es esto un indicador de éxito? Estoy un poco confundido porque pensé que las DLL iban a estar sentadas exactamente a 0x41000000, 0x42000000 y 0x43000000. Los resultados muestran que cuelgan en esa área, pero nunca se sentaron donde les pedí que se sentaran. Tengo entendido que desea que los DLL se carguen exactamente en la dirección que les pide para que no tengan que someterse a la costosa operación de rebase (que es muy muy caro cuando sus dlls han sido ngen'd). Pero, ¿no es esto exactamente lo que está pasando? Claro, mis DLL están dando vueltas en un área determinada, pero no están sentados exactamente donde les pedí que se sentaran, por lo que seguramente la costosa operación de rebasamiento se está preparando en cada momento de ejecución. Esto es exactamente lo que quería evitar.

Nota: No estoy interesado en los argumentos para/en contra de Rebasing y NGEN. Solo quiero saber qué está pasando y cómo hacer que funcione.

¡Saludos!

¿Fue útil?

Solución

Podría ser ASLR (ADDRES Space Layout Randomization): consulte los enlaces de http://social.msdn.microsoft.com/forums/en/vcgeneral/thread/bac7e300-f3df-4087-9c4b-847880d625ad

Otros consejos

¿No se restringe la herramienta NGEN especificando una dirección base para la imagen binaria que hace para un ensamblaje? AFAIK Tienes que compilar la "dirección base preferida" en el ensamblaje en sí. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

Editar *

Sin embargo, si el cargador no puede colocar el módulo en la dirección deseada (porque se superpone con otro módulo o pieza de datos ya cargado o asignado), el módulo se rebaja, lo que significa que se carga en alguna otra dirección. Esto implica que todas las direcciones dentro de la imagen ejecutable deben arreglarse.

También mirando Internet, parece que muchos desarrolladores desean esta característica, pero el problema es reservar direcciones base que no entran en conflicto con las de otros desarrolladores de la Asamblea. ¿En qué otros DLL están sentados en las direcciones en las que esperaba que estuviera suyo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top