OPTLINK and LARGEADDRESSAWARE

Robert Fraser fraserofthenight at gmail.com
Wed Apr 15 07:42:40 PDT 2009


Vladimir Panteleev wrote:
> Hi,
> 
> It seems that OPTLINK doesn't support the IMAGE_FILE_LARGE_ADDRESS_AWARE 
> flag (enabled with /LARGEADDRESSAWARE when using Microsoft Link), even 
> though the D runtime seems to support it.
> 
> Consider this simple program:
> 
> -----------------------------
> import std.stdio;
> 
> void main()
> {
>     ubyte[][4096] a; // GC anchor
>     for (int i=0;;i++)
>     {
>         writefln(i);
>         a[i].length = 1024*1024;
>     }
> }
> -----------------------------
> 
> This program crashes when it tries to allocate the 1618th megabyte, even 
> though my PC has 6 GB of RAM and the 32-bit address space allows for 
> much more.
> 
> I've patched the executable and enabled the 
> IMAGE_FILE_LARGE_ADDRESS_AWARE flag. This flag is 0x0020 in the 
> "Characteristics" field in the IMAGE_FILE_HEADER structure. In 
> OPTLINK-generated executables, one can enable this flag manually by 
> changing byte 0x76 from 0x8E to 0xAE in the executable file.
> 
> The result - the program can now allocate 3319 megabytes on my machine, 
> thus practically doubling its address space.
> (Why is it still not anywhere near the theoretical limit?)
> 
> I've patched my copy of the linker until the official linker is updated. 
> If anyone wants to use more than 2 (or 1.6?) GB in their DMD/Windows 
> programs, change the byte at 0x3CF0D in link.exe from 0x8F to 0xAF.
> 

Awesome simple hack; thanks!



More information about the Digitalmars-d mailing list