【发布时间】:2010-11-23 16:57:36
【问题描述】:
假设我使用 /3GB 开关启动了一个 32 位 Windows Server,我怎样才能让 .NET 应用程序使用额外的地址空间?
【问题讨论】:
-
而 LARGEADDRESSAWARE 可以在 64 位 Windows 上为您提供 4GB 减去 64KB (see on "The Old New Thing")
假设我使用 /3GB 开关启动了一个 32 位 Windows Server,我怎样才能让 .NET 应用程序使用额外的地址空间?
【问题讨论】:
该标志是图像标题的一部分,因此您需要使用 editbin 对其进行修改。
editbin /LARGEADDRESSAWARE <your exe>
使用dumpbin /headers 并查找Application can handle large (>2GB) addresses 的存在以查看是否设置了标志。
【讨论】:
Application can handle large (>2GB) addresses 字符串
editbin /LARGEADDRESSAWARE,而不是在任何 dll 上,它可以工作(在 Windows 10 64 位上)
据我所知,您必须使用现有答案中显示的 editbin 实用程序。似乎没有任何方法可以使用 Visual Studio .NET 设置标志,看起来他们鼓励人们尽可能编译为 64 位而不是使用标志
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93771
【讨论】:
要从 Visual Studio 自动执行此操作,请参阅此问题: flag from visual studio.
【讨论】:
将这些行添加到 Post build:
call "$(DevEnvDir)..\tools\vsdevcmd.bat"
editbin /largeaddressaware "$(TargetPath)"
【讨论】:
到目前为止,还没有提供跨平台和开源方式在 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" 命令并查看它是否有输出。
【讨论】:
SIGSEGV 错误。有什么办法可以解决吗?