2017-09-08 125 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

相關問題