Как сделать приложение.NET "большим адресом"?
Предполагая, что я загрузил 32-битный Windows Server с параметром /3GB, как я могу заставить приложение.NET использовать дополнительное адресное пространство?
5 ответов
Флаг является частью заголовка изображения, поэтому вам нужно изменить его, используя editbin.
editbin /LARGEADDRESSAWARE <your exe>
использование dumpbin /headers
и искать наличие Application can handle large (>2GB) addresses
чтобы увидеть, установлен флаг или нет.
Из того, что я могу сказать, вы должны использовать утилиту editbin, показанную в существующем ответе. Кажется, нет никакого способа установить флаг с помощью Visual Studio .NET, похоже, что они побуждают людей компилировать для 64-битной версии, если это возможно, вместо использования флага
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93771
Добавьте эти строки в пост сборки:
call "$(DevEnvDir)..\tools\vsdevcmd.bat"
editbin /largeaddressaware "$(TargetPath)"
Для того, чтобы сделать это автоматически из Visual Studio, пожалуйста, обратитесь к этому вопросу: флаг из Visual Studio.
До сих пор не было ответа, дающего кросс-платформенный способ с открытым исходным кодом для установки бита LAA в исполняемом файле PE, поэтому я решил заполнить пробел.
Примечание: убедитесь, что у вас есть резервная копия!
Вы можете это сделать с помощью реверс-инжиниринга фреймворка Radare2. Если вы используете дистрибутив Linux, Radare2 обычно находится в репозитории. К сожалению, возможность установки бита не встроена, тем не менее это довольно легко сделать с помощью следующего скрипта:
e cfg.newshell=true # allows nested $(…) commands
s/ PE\0\0 # search PE file signature
s +4 # skip the signature
echo "Original content:"
pf.pe_image_file_header.characteristics
echo "Patching the file…"
s+ 0x12 # go to the characteristics field
wv2 $(?v $(pv2) \| 0x20) # 0x20 is the LAA bit, binary-OR it in the address
s-
echo "The new content:"
pf.pe_image_file_header.characteristics
Вот демонстрация того, как вы его используете (скрипт находится в
λ r2 -qi script.r2 -nnw notepad.exe
Searching 4 bytes in [0x1-0x620ca]
0x00000080 hit0_0 .mode.$PE\u0000\u0000Ld`J.
Original content:
characteristics : 0x00000096 = characteristics (bitfield) = 0x00000107 : IMAGE_FILE_RELOCS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_32BIT_MACHINE
Patching the file…
The new content:
characteristics : 0x00000096 = characteristics (bitfield) = 0x00000127 : IMAGE_FILE_RELOCS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_LARGE_ADDRESS_AWARE | IMAGE_FILE_32BIT_MACHINE
Чтобы дважды проверить, что это сработало, вы также можете использовать use