I ran into this issue during performance testing.
When compiling a C# Console application with the x86 platform flag, the Large Address Aware flag is not set:
Output from dumpbin /headers app.exe
:
Dump of file app.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
3 number of sections
569F0089 time date stamp Tue Jan 19 21:35:37 2016
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
When setting the flag to "Any Cpu" the resulting exe is Large Address Aware:
Dump of file app.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
3 number of sections
569F01D7 time date stamp Tue Jan 19 21:41:11 2016
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
22 characteristics
Executable
Application can handle large (>2GB) addresses
Notice that the "Application can handle large (>2GB) addresses" flag is set.
I cannot find any documentation on this subject. All other stack overflow questions suggest you must do this manually:
How to enable IMAGE_FILE_LARGE_ADDRESS_AWARE in C# source code?
Can I set LARGEADDRESSAWARE from within Visual Studio?
Use the 3Gb of memory in 32 bits applications
The question is: Where is this documented?
Compiling a C Program. Compiling is the transformation from Source Code (human readable) into machine code (computer executable). A compiler is a program.
C is a mid-level language and it needs a compiler to convert it into an executable code so that the program can be run on our machine.
The compiler checks the source code for the syntactical or structural errors, and if the source code is error-free, then it generates the object code. The c compilation process converts the source code taken as input into the object code or machine code.
The purpose of AnyCPU is to be able to run managed code on both x86 and x64 platforms while at the same time take advantage of the larger address space of x64 platforms. The only way to do this is to mark the binary as large address aware when targeting AnyCPU. In addition, if this was not the case, it would have not been appropriate to make Prefer 32-bit the default.
Where is this documented?
This has not been explicitly documented, it's implied.
All other stack overflow questions suggest you must do this manually
Irrespective of all of those questions and answers, this is required only when targeting x86.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With