Image base address

From RAD Studio
Jump to: navigation, search

Go Up to Delphi Compiler Directives (List) Index




{$IMAGEBASE number}


{$IMAGEBASE $00400000}



The $IMAGEBASE directive controls the default load address for an application, DLL, or package. The number argument must be a 32-bit integer value that specifies image base address. The number argument must be greater than or equal to $00010000, and the lower 16 bits of the argument are ignored and should be zero. The number must be a multiple of 64K (that is, a hex number must have zeros as the last 4 digits) otherwise it will be rounded down to the nearest multiple, and you will receive a compiler message.

When a module (application or library) is loaded into the address space of a process, Windows will attempt to place the module at its default image base address. If that does not succeed, that is if the given address range is already reserved by another module, the module is relocated to an address determined at run time by Windows.

There is seldom, if ever, any reason to change the image base address of an application. For a library, however, it is recommended that you use the $IMAGEBASE directive to specify a non-default image base address, since the default image base address of $00400000 will almost certainly never be available. The recommended address range of DLL images is $40000000 to $7FFFFFFF. Addresses in this range are always available to a process in both Windows NT/2000 and Windows 95/98.

When Windows succeeds in loading a DLL (or package) at its image base address, the load time is decreased because relocation fix-ups do not have to be applied. Furthermore, when the given address range is available in multiple processes that use the library, code portions of the DLL's image can be shared among the processes, thus reducing load time and memory consumption.

Note: The $IMAGEBASE directive overrides any value supplied with the -K command line compiler directive option.