假设我使用/ 3GB开关启动了32位Windows Server,如何让.NET应用程序使用额外的地址空间?
答案 0 :(得分:51)
该标志是图像标题的一部分,因此您需要使用editbin修改它。
editbin /LARGEADDRESSAWARE <your exe>
使用dumpbin /headers
并查找是否存在Application can handle large (>2GB) addresses
,以查看该标志是否已设置。
答案 1 :(得分:8)
据我所知,您必须使用现有答案中显示的editbin实用程序。似乎没有任何方法可以使用Visual Studio .NET设置标志,看起来他们鼓励人们在可能的情况下编译64位而不是使用标志
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93771
答案 2 :(得分:2)
要从Visual studio自动执行,请参阅此问题: flag from visual studio
答案 3 :(得分:1)
到目前为止,还没有给出跨平台和开源方式在 PE 可执行文件上设置 LAA 位的答案,所以我决定填补空白。
注意:确保您有备份!
您可以使用逆向工程框架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
这里有一个演示如何使用它(脚本在 script.r2
文件中)和一个 notepad.exe
文件:
λ 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
要仔细检查它是否有效,您还可以使用 objdump -p notepad.exe | grep "large address aware"
命令并查看它是否有输出。
答案 4 :(得分:0)
将这些行添加到Post构建中:
call "$(DevEnvDir)..\tools\vsdevcmd.bat"
editbin /largeaddressaware "$(TargetPath)"