The Facts
Every
executable and DLL module has a
preferred base address which
represents the “ideal” location
where the module should get
mapped to inside the process’s
address space.
Typically, when a programmer
builds a DLL module, the linker
sets the preferred base address
at 0x10000000. This can be
easily verified by using the
Visual Studio’s DumpBin utility
or Sysinternals’ Process
Explorer.
The Problem
Figure 1
illustrates the problem. Let's
say you want to run an
executable that requires two
DLLs. The loader maps the first
DLL at its preferred base
address of 0x10000000. It then
attempts to map the second DLL
at the same preferred base
address of 0x10000000., but will
fail because the first DLL is
already mapped at this address.
As a remedy, the loader must
“relocate” the second DLL module
by placing it somewhere else
inside the process’s address
space. It must also perform the
necessary DLL code fix-ups.
Figure 1 – An example of a DLL collision
Relocating DLLs and performing the necessary fix-up operations is absolutely taxing on a system. The loader has to relocate hundreds of DLLs and
modify a significant portion of each DLL’s code. This leads to more memory consumption and excessive copy-on-write operations.
This run-time overhead can be very damaging to the performance of a system and must be avoided at all costs. When multiplied by
the number of users on a Terminal Server, this overhead can have devastating implications on performance and application response times.
Next: Max-IT (VM) - The Solution