在Windows 10上使用MinGW构建的Clang的调试版本无法运行

时间:2017-09-08 15:26:25

标签: c++ windows clang llvm

我在Windows上使用MinGW构建了Clang,目标是三倍x86_64-w64-windows-gnu。可执行文件clang.exe和clang ++。exe按预期工作,如果我在发布模式下构建它们(它们编译程序没有错误),但是当在调试模式下构建时我无法运行它们并得到this error - “这个应用程序可以' t在你的电脑上运行“。来自同一版本的其他可执行文件(如clang-check.exe)不会显示此错误并正确运行。

似乎这可能是文件大小的问题,因为clang.exe和clang ++。exe都是>大小为2GB,而其他可执行文件较小,但我认为64位Windows上的文件大小限制为4GB。

还有其他人遇到过类似的问题吗?如果文件大小有问题,是否可以让LLVM将调试符号放在单独的文件中以减小可执行文件的大小?

编辑:我试图通过在构建LLVM时使用-gsplit-dwarf标志将调试符号转储到单独的文件来减少可执行文件大小,但它没有任何效果。

1 个答案:

答案 0 :(得分:5)

是的,文件大小是解决这个问题的一个很好的暗示。 IMAGE_OPTIONAL_HEADER64.SizeOfImage field是一个DWORD,表示最大大小为4 GB。但是还有另外一个限制,OS加载器将整个.exe或.dll文件映射到内存中,并带有内存映射文件。 MMF上的视图永远不会超过2 GB。这是一个很难的技术限制,它甚至适用于x64。有关this post中此问题的更多信息。

调试信息无疑是图像文件爆炸严重的原因。相比之下,VS2017附带的clang构建需要27MB用于前端,32MB用于x64后端。从this project page

可以看出为什么-gsplit-dwarf无法解决您的问题
  

Fission在GCC 4.7中实现,需要最近版本的objcopy和黄金链接器的支持。

MinGW无法为您提供黄金链接器。他们没有试图移植它,因为它只能生成ELF图像。冷酷的事实,只要你依赖MinGW就可以在没有好桨的情况下找到一条小溪。

需要一些激烈的东西。我会犹豫地提到Cygwin。考虑另一个编译器,比如使用Clang构建Clang :)或MSVC ++。社区版是免费下载的。另外一定要看看Clang port,他们做了很多工作才能使ABI兼容。