2017-09-08 89 views
5

Ben hedef üçlü x86_64-w64-windows-GNU'da Windows üzerinde MinGW ile çınlama kurduk. Execute'lar clang.exe ve clang ++. Exe beklendiği gibi yayınlanma modunda (eğer programları hatasız derlerler) oluşturduğum gibi çalışır, ancak hata ayıklama modunda oluştururken onları çalıştıramıyor ve this error'u elde edemiyorum - "Bu uygulama sizin bilgisayarınızda çalışamaz." PC". Clang-check.exe gibi aynı yapıdaki diğer yürütülebilir dosyalar bu hatayı görüntülemez ve doğru şekilde çalışır.ayıklama inşa çalıştırılamaz

Bu, hem clang.exe hem de clang ++ gibi dosya boyutunda bir sorun olabilir gibi görünüyor. Exe> 2GB boyutundayken diğer yürütülebilir dosyalar daha küçük ama ben dosya boyutu sınırının 64 olduğu izleniminin altındaydım. -bit Windows 4GB'dir.

benzer bir sorun haline başkasının çalıştırmak mı? Dosya boyutu sorun ise, LLVM'nin yürütülebilir dosyanın boyutunu azaltmak için hata ayıklama sembollerini ayrı bir dosyaya koyması mümkün mü?

DÜZENLEME: LLVM oluştururken hata ayıklama sembollerini -gsplit-cüce bayrağını kullanarak ayrı bir dosyaya dökerek çalıştırılabilir boyutu azaltmaya çalıştım ancak herhangi bir etkisi yok.

cevap

4

Evet, dosya boyutu bu sorunu yaşıyor oldukça iyi bir ipucu. IMAGE_OPTIONAL_HEADER64.SizeOfImage field, bir DWORD'dir ve 4 GB'lık bir maksimum boyut anlamına gelir. Ama ilk önce tek bir limit daha var; OS yükleyicisi, tüm .exe veya .dll dosyalarını bellek eşlemeli bir dosya ile belleğe eşler. MMF'nin görünümü asla 2 GB'den büyük olamaz. Bu zor bir teknik sınırlamadır, hatta x64 için de geçerlidir. Bu sorun hakkında daha fazla bilgi için this post.

ayıklama bilgisi görüntü dosyası çok kötü darbeler sebebi şüphesiz. Karşılaştırma için, VS2017'nin içerdiği clang yapısının ön uç için 27MB ve x64 arka uç için 32 MB olması gerekiyor.

Bölünme GCC 4.7 uygulanan ve objcopy ve altın bağlayıcı son sürümlerinde destek gerektirir: -gsplit-cüce çözemez Neden senin sorunun this project page görülebilir.

MinGW altın bağlayıcı size sağlayamaz. Sadece ELF görüntüleri oluşturabildiğinden, onu yerleştirme girişiminde bulunmamışlardır. Soğuk sert gerçekler, MinGW'ye bağlı olduğunuz sürece, iyi bir kürek olmadan bir derenin üzerindeyseniz. köklü

şey gereklidir. Cygwin'den tereddütle bahsedeceğim. Clang'ı kullanmak için Clang'ı kullanmaktan başka bir derleyiciyi düşünün :) Ya da MSVC++. Topluluk sürümü ücretsiz indirilebilir. Ayrıca, Clang port'a da göz attığınızdan emin olun, ABI uyumlu hale getirmek için çok çalıştık.

+0

Teşekkürler, sınırlamanın dosya boyutundan ve başka bir şeyden kaynaklanmadığını bilmek güzel. LLD bağlayıcısının hata ayıklama sembollerini ayrı bir dosyaya ayırmayı destekleyip desteklemediğini biliyor musunuz? Ben açık kaynak başlıkları kullanmak için başlangıçta Clang kurmak için başlangıçta Clang kurmak için MinGW kullanarak sıkışmış ama ben -DCMAKE_LINKER bayrağı kullanarak hata ayıklama sembolleri ile Clang inşa ederken LLD kullanmak mümkün olmalıdır. – ed95