Как сделать приложение.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)"

От: vsvars32.bat в Visual Studio 2017

Для того, чтобы сделать это автоматически из 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 команду и убедитесь, что она имеет вывод.

Другие вопросы по тегам