【问题标题】:How to make a .NET application "large address aware"?如何使 .NET 应用程序“感知大地址”?
【发布时间】:2010-11-23 16:57:36
【问题描述】:

假设我使用 /3GB 开关启动了一个 32 位 Windows Server,我怎样才能让 .NET 应用程序使用额外的地址空间?

【问题讨论】:

标签: .net windows memory


【解决方案1】:

该标志是图像标题的一部分,因此您需要使用 editbin 对其进行修改。

editbin /LARGEADDRESSAWARE <your exe>

使用dumpbin /headers 并查找Application can handle large (&gt;2GB) addresses 的存在以查看是否设置了标志。

【讨论】:

  • 在 dumpbin 输出中查找 Application can handle large (&gt;2GB) addresses 字符串
  • 事后在可执行文件中设置标头是否会使 .NET 应用程序“感知大地址”,或者您是否真的需要以不同的方式编写或编译您的应用程序以使其“感知大地址”?在 64 位 Windows 系统(win7 或更高版本)上对内存不足的任何 32 位可执行文件执行此操作是否有任何陷阱/陷阱?
  • 您需要对库中的每个 DLL 或仅主 exe 执行此操作吗?
  • 我试图只在我现有的 .exe(C# WPF、x86)上使用editbin /LARGEADDRESSAWARE,而不是在任何 dll 上,它可以工作(在 Windows 10 64 位上)
【解决方案2】:

据我所知,您必须使用现有答案中显示的 editbin 实用程序。似乎没有任何方法可以使用 Visual Studio .NET 设置标志,看起来他们鼓励人们尽可能编译为 64 位而不是使用标志

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93771

【讨论】:

    【解决方案3】:

    要从 Visual Studio 自动执行此操作,请参阅此问题: flag from visual studio.

    【讨论】:

      【解决方案4】:

      将这些行添加到 Post build:

      call "$(DevEnvDir)..\tools\vsdevcmd.bat"
      editbin /largeaddressaware "$(TargetPath)"
      

      发件人:vsvars32.bat in Visual Studio 2017

      【讨论】:

        【解决方案5】:

        到目前为止,还没有提供跨平台和开源方式在 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 错误。有什么办法可以解决吗?
        • @3174N 这是您的雷达版本中的错误,在任何情况下都不应该出现段错误。我建议将其报告给您的版本的维护者。至于解决方法:好吧,同时你可以build radare yourself,我希望它不会有这个问题(至少我上次测试时没有)
        • 自己建造雷达确实解决了这个问题。谢谢!
        猜你喜欢
        • 2011-03-07
        • 1970-01-01
        • 2021-01-26
        • 2011-02-25
        • 1970-01-01
        • 2011-05-21
        • 2021-04-04
        • 1970-01-01
        • 2013-09-16
        相关资源
        最近更新 更多