2012-02-23 18 views
12

Mac OS X 10.6'da GCC 4.6.2 kullanıyorum. Derlediğimde -static-libgcc seçeneğini kullanıyorum, aksi takdirde ikili dosyaları sistemde libgcc arar ve GCC 4.2 üzerinde bir şey OS X'de desteklendiğinden emin değilim. Bu iyi çalışıyor, ama neden libgcc'e ihtiyacım var? Bunu okudum ve GNU dokümanları "hedef işlemcinin doğrudan gerçekleştiremediği aritmetik işlemler" içerdiğini söylüyor. Bu operasyonların ne olduğunu nasıl bilebilirim? Ve neden bu kütüphaneyi dahil etmek zorunda olduğum çok karmaşık? GCC neden bu kütüphane işlevlerine başvurmak yerine kodu doğrudan optimize edemiyor? Biraz kafam karıştı. Bunun hakkında herhangi bir anlayış takdir edilecektir!Gerçekten libgcc'e ihtiyacım var mı?

+0

Muhtemel Unix'te: http://unix.stackexchange.com/questions/1812/what-does-libgcc-s-so-contain –

cevap

16

Evet, buna ihtiyacınız var. İhtiyacınız yoksa, statik olarak bağlanması zararsızdır. İhtiyacın olup olmadığını -t link izleme seçeneğini (sanırım) kullanarak söyleyebilirsiniz.

Tek bir talimatta yapamayacağınız çeşitli şeyler vardır (genellikle 32 bit mimarilerde 64 bit işlemler gibi). Bu şeyler yapılabilir, ancak önemsiz sayıda talimatlar kullanırlarsa, hepsinin tek bir yerde toplanması için daha fazla alan etkilidir.

-O0 kullanarak en iyi duruma getirme özelliğini devre dışı bıraktığınızda (aslında bu zaten varsayılan değerdir), GCC hemen hemen her zaman libgcc rutinlerini kullanır.

hızını eniyilemeyi etkinleştirdiğinizde, GCC, komut dizisini doğrudan doğruya kodun içine eklemeyi seçebilir (nasıl yapılacağını bilir). Libgcc sürümlerinin hiçbirini kullanmadan bittiğini görebilirsiniz - daha az libgcc araması kullanacaktır.

boyutu eniyilemelerini etkinleştirdiğinizde, GCC işlev çağrısını tercih edebilir ya da olmayabilir - bu, GCC geliştiricilerinin her durumda en iyi hız/boyut aktarma şeklini düşündüğüne bağlıdır. Hız için optimizasyon yaptığınızda bile, derleyici, bazı işlevlerinin kullanılmasının mümkün olmadığını ve boyutları için bunları optimize edeceğini, hatta PGO kullanıyor olsanız bile bunu en iyi duruma getirebileceğini unutmayın.

Temel olarak, memcpy veya matematik kitaplığı işlevleriyle aynı şekilde düşünebilirsiniz: derleyici, yargılamanın faydalı olduğu yargılama işlevlerini yerine getirir ve aksi halde kitaplık işlevlerini çağırır. Derleyici, kütüphane tanımına bakmadan standart fonksiyonlar ve libgcc fonksiyonunu "inline" yapabilir, elbette - sadece ne yaptığını "bilir".

Statik veya dinamik libgcc kullanılıp kullanılmayacağı ilginç bir işlemdir. Bir yandan, dinamik (paylaşılan) bir kütüphane tüm sisteminizde daha az bellek kullanır ve önbelleğe alınma olasılığı daha yüksektir. Öte yandan, statik bir libgcc'in daha düşük bir çağrı yükü vardır.

Ancak en önemli şey uyumluluk. Açıkçası libgcc kütüphanesinin programınızın çalışması için mevcut olması gerekir, ancak aynı zamanda uyumlu bir versiyon olmalıdır. Sabit bir GCC sürümü ile Linux dağıtımında sorun yok, ancak statik bağlantı daha güvenli.

Umarım sorularınızı yanıtlar.

+0

Evet! Süper yardımsever. Teşekkürler! – Synthetix

İlgili konular