2017-09-08 48 views
5

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

看起来好像这可能是文件大小的问题,因为clang.exe和clang ++。exe的大小都大于2GB,而其他可执行文件的大小却比较小,但我的印象是文件大小限制在64位Windows是4GB。

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

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

回答

4

是的,文件大小是有这个问题的一个很好的暗示。 IMAGE_OPTIONAL_HEADER64.SizeOfImage field是一个DWORD,表示最大大小为4 GB。但是首先有另一个限制,OS加载程序使用内存映射文件将整个.exe或.dll文件映射到内存中。关于MMF的观点永远不会超过2 GB。这是一个严格的技术限制,它甚至适用于x64。更多关于this post中的这个问题。

调试信息无疑是图像文件爆炸的原因。相比之下,VS2017包含的clang版本需要前端27MB和后端64MB。为什么-gsplit矮解决不了你的问题是可见的this project page

裂变在GCC 4.7实现的,需要从最新版本objcopy把和金连接器的支持。

MinGW无法为您提供黄金链接器。他们没有尝试移植它,因为它只能生成ELF图像。冷酷的事实,只要你依靠MinGW,那么你就没有一个好的桨,就是一条小溪。

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

+0

谢谢,这是很好的知道,限制是由于文件的大小,而不是别的。 您是否知道LLD链接器是否支持将调试符号拆分为单独的文件?不幸的是我最初使用MinGW来构建Clang,因为我需要使用开放源代码头文件,但是我应该能够使用-DCMAKE_LINKER标志使用LLD通过调试符号构建Clang时进行链接。 – ed95

相关问题